C语言矩阵求逆出现malloc(): corrupted top size错误如何解决
问题原因与修复方案
核心错误1:for循环增量写错导致死循环越界
你inverse函数里的第一层高斯消元循环写反了增量变量:
for(int p=0; p<n; n++) // 错误:每次循环自增的是n而非p
修改为正确写法即可:
for(int p=0; p<n; p++)
你原本的写法会让n的值不断增大,p永远满足p < n的循环条件,最终访问mat、I数组时远远超出申请的内存范围,直接破坏堆内存结构,就是你看到的malloc(): corrupted top size报错的根源,valgrind报的非法读写也是因为越界访问了不属于你的内存地址。
核心错误2:输入矩阵不是合法的可求逆方阵
求逆矩阵的前提是输入必须是行数等于列数的满秩方阵,但你的代码里存在维度不匹配问题:
- main函数中给rslt申请的是
n=7行,每行只有k+1=5个元素,也就是rslt是7行5列的非方阵 - 你把这个7行5列的矩阵传给inverse,同时传的参数n=7,inverse会把它当成7行7列的矩阵处理,访问
mat[p][x]当x>=5的时候就已经越界了
修复要求:
- 先保证乘法输出的结果是方阵:只有当第一个矩阵的列数等于第二个矩阵的行数,且输出的行数等于列数时,乘积才是方阵。比如你要得到77的乘积,就需要调整相乘的两个矩阵的维度为7m和m*7
- 给rslt申请内存时要保证每行的元素数等于行数,比如n行n列的矩阵,每行要malloc
sizeof(double)*n的空间
其他可优化点
- 高斯消元过程没有处理主元为0的情况,如果输入矩阵是奇异矩阵(不满秩),会出现除以0的错误,建议加主元非0判断逻辑
- inverse函数声明返回
double**但你没有返回值,要么改返回值为void,要么取消free(I)的逻辑返回计算得到的逆矩阵指针
内容的提问来源于stack exchange,提问作者user15409086
相关产品推荐
相关产品推荐

