实现高斯消元法的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
相关产品推荐
相关产品推荐

