C语言编写矩阵乘法程序调用free释放结构体指针报错求助
问题核心原因
你遇到的释放报错问题核心由两个错误导致:
InitMatrix函数中结构体内存分配大小错误:你当前代码写的是*m = (matrix*)malloc(sizeof(matrix*));,这里sizeof(matrix*)计算的是指针类型的大小(32位系统为4字节、64位系统为8字节),远小于matrix结构体本身需要的内存空间,后续对结构体成员的读写都属于堆内存越界访问,这是释放结构体时崩溃的直接原因。- 代码缺失
DestoryMatrix函数的实现,若释放顺序不对也会触发报错。
修正方案
1. 修正InitMatrix的内存分配逻辑
将malloc的参数改为结构体本身的大小即可:
bool InitMatrix(matrix** m) { // 修正:分配matrix结构体对应的内存大小,而非指针大小 *m = malloc(sizeof(matrix)); if (!*m) return false; (*m)->x = 0, (*m)->y = 0; (*m)->values = NULL; return true; }
注:C语言中malloc返回值无需强制类型转换,写法更规范
2. 补全正确的DestoryMatrix实现
释放顺序要和分配顺序相反:先逐行释放values的行内存,再释放values二级指针本身,最后释放结构体,释放后将指针置空避免野指针:
void DestoryMatrix(matrix** m) { if (m == NULL || *m == NULL) return; // 先释放二维数组的每一行 if ((*m)->values != NULL) { for (int i = 0; i < (*m)->x; i++) { free((*m)->values[i]); } // 再释放二级指针本身 free((*m)->values); (*m)->values = NULL; } // 最后释放结构体 free(*m); *m = NULL; }
额外优化建议
mallocTowAry函数中如果某一行malloc失败,需要先把之前已经分配成功的行内存释放,再释放values指针,避免产生内存泄漏。
内容的提问来源于stack exchange,提问作者yida wu
相关产品推荐
相关产品推荐

