You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现高斯消元法的C程序报segmentation fault错误如何排查?

高斯消元程序段错误问题定位

直接触发段错误的错误点

  • 索引整体越界:你申请的矩阵A合法索引范围为行/列0~N-1,但run函数中三角化部分循环边界写为j<N+1、i<N+1,当N=3时会访问A[3][x]这类不存在的内存地址,直接触发段错误。
  • 增广矩阵空间不足:高斯消元需要N行N+1列的增广矩阵存储系数和常数项,你当前仅申请了N列空间,后续访问A[i][N]、A[i][N+1]均为越界访问。
  • x数组越界:你为x申请了N*sizeof(float)的空间,合法索引为0~N-1,代码中直接赋值x[N]超出了申请的内存范围。
  • 语法笔误:回代步骤中A[i][I]的I为大写,C语言大小写敏感,未定义的大写I会导致取值错误。

修复方案

1. 调整矩阵申请与读取逻辑

将矩阵改为N行N+1列的增广矩阵,读取A.txt的最后一列作为常数项:

// main函数中修改内存申请逻辑
for(i = 0; i < N; i++) 
{
    A[i] = (float *)malloc((N+1)*sizeof(float));
}
// 调整get_2D_array调用参数,读取N+1列
get_2D_array(A, N, N+1, A_path);

2. 修正run函数所有边界与逻辑

void run(float **A)
{
    float c;
    float sum;
    float *x = malloc(N*sizeof(float));

    // 生成上三角矩阵
    for(int j=0; j<N; j++)
    {
        for(int i=j+1; i<N; i++)
        {
            c = A[i][j]/A[j][j];
            // 增广矩阵要更新到第N列的常数项
            for(int k=j; k<N+1; k++)
            {
                A[i][k] = A[i][k] - c*A[j][k];
            }
        }
    }
    x[N-1] = A[N-1][N]/A[N-1][N-1];

    // 回代求解
    for(int i=N-2; i>=0; i--)
    {
        sum=0;
        for(int j=i+1; j<N; j++)
        {
            sum += A[i][j] * x[j];
        }
        x[i] = (A[i][N] - sum)/A[i][i];
    }

    // 输出结果
    printf("\nThe solution is: \n");
    for(int i=0; i<N; i++)
    {
        printf("\nx%d=%f\t",i+1,x[i]);
    }
    free(x);
}

注意:你当前使用的测试矩阵为奇异矩阵,行列式为0,不存在唯一解,修复索引问题后运行会出现除零错误,建议更换为非奇异满秩矩阵测试。

内容的提问来源于stack exchange,提问作者Anna-Kat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:54:03