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

C语言编写矩阵乘法程序调用free释放结构体指针报错求助

问题核心原因

你遇到的释放报错问题核心由两个错误导致:

  1. InitMatrix函数中结构体内存分配大小错误:你当前代码写的是*m = (matrix*)malloc(sizeof(matrix*));,这里sizeof(matrix*)计算的是指针类型的大小(32位系统为4字节、64位系统为8字节),远小于matrix结构体本身需要的内存空间,后续对结构体成员的读写都属于堆内存越界访问,这是释放结构体时崩溃的直接原因。
  2. 代码缺失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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:15:00