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

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的时候就已经越界了

修复要求:

  1. 先保证乘法输出的结果是方阵:只有当第一个矩阵的列数等于第二个矩阵的行数,且输出的行数等于列数时,乘积才是方阵。比如你要得到77的乘积,就需要调整相乘的两个矩阵的维度为7m和m*7
  2. 给rslt申请内存时要保证每行的元素数等于行数,比如n行n列的矩阵,每行要mallocsizeof(double)*n的空间

其他可优化点

  • 高斯消元过程没有处理主元为0的情况,如果输入矩阵是奇异矩阵(不满秩),会出现除以0的错误,建议加主元非0判断逻辑
  • inverse函数声明返回double**但你没有返回值,要么改返回值为void,要么取消free(I)的逻辑返回计算得到的逆矩阵指针

内容的提问来源于stack exchange,提问作者user15409086

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:15:04