矩阵求逆代码运行触发Segmentation Fault错误排查
矩阵求逆段错误问题修复
错误根因
你代码里的第一个for循环增量写反了,将p++错写为n++:
// 错误写法 for(int p=0; p<n; n++)
该错误会触发两个问题:
- 循环变量p永远为0,
p < n的终止条件永远不会触发,程序进入死循环 - n的值会不断累加变大,远超过你最初申请的矩阵尺寸,访问
mat[p][x]、I[p][x]时会超出合法内存边界,直接触发Segmentation Fault。
其他需要注意的问题
- 你当前的代码最后释放了单位矩阵I的内存,但函数声明的返回值是
double**,如果你需要将逆矩阵返回给调用方使用,不要在函数内执行free操作,应该把内存释放逻辑移到调用方用完逆矩阵之后。 - 没有对主元
mat[p][p]做非0校验,如果传入的是奇异矩阵(不可逆矩阵),会出现除以0的报错。 - 代码直接修改了传入的原矩阵mat的内容,如果业务侧不允许修改原矩阵,需要先拷贝一份原矩阵再执行消元操作。
修复后的核心代码段
仅需要修改第一个for循环的增量即可解决段错误:
// 修复后写法 for(int p=0; p<n; p++){ f = mat[p][p]; for(int x=0; x<n; x++){ mat[p][x] = mat[p][x] / f; I[p][x] = I[p][x] / f; } for(int i=p+1; i<n; i++){ f = mat[i][p]; for(int x=0; x<n; x++){ sub = mat[p][x] * f; mat[i][x] = mat[i][x] - sub; sub = I[p][x] * f; I[i][x] = I[i][x] - sub; } } }
内容的提问来源于stack exchange,提问作者user15409086
相关产品推荐
相关产品推荐

