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

C语言中释放二维动态数组内存时调用free()程序崩溃求助

问题分析与解决方案

先拆解你代码里的关键问题,这就是触发free(to_Release)崩溃的核心原因:

1. 二维数组外层分配的参数完全搞反了

你的dyn_matrix_allocation函数中,外层指针的分配代码是:

void **matrix = (void**)calloc(sizeof(int*), cols);

但你要创建的是rows行的二维数组,外层应该分配rows个int*类型的空间,而不是cols!之后你又循环rows次去给每行分配内存——如果rows > cols,就会直接越界访问matrix数组,破坏堆内存的结构。堆一旦被损坏,后续任何内存操作(包括最后free(to_Release))都会触发崩溃。

2. 类型不匹配的隐性隐患

dyn_matrix_allocation返回的是void**,但你在Ex()里把它赋值给了int** Matrix。虽然C语言允许这种隐式转换,但类型不一致可能会埋下指针操作的隐患,最好保持类型统一。


正确的二维数组分配与释放实现

修正后的分配函数

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int** dyn_matrix_allocation(int rows, int cols) {
    // 外层分配rows个int*指针,对应二维数组的行数
    int **matrix = (int**)calloc(rows, sizeof(int*));
    assert(matrix != NULL);

    for (int i = 0; i < rows; i++) {
        // 每行分配cols个int的空间,对应二维数组的列数
        matrix[i] = (int*)calloc(cols, sizeof(int));
        assert(matrix[i] != NULL);
    }
    return matrix;
}

正确的释放函数

void free_My_Dyn_Mem(int **to_Release, int rows) {
    // 第一步:逐个释放每行的内存
    for (int i = 0; i < rows; i++) {
        free(to_Release[i]);
        // 可选操作:将指针置空,避免后续误操作野指针
        to_Release[i] = NULL;
    }
    // 第二步:释放外层的指针数组
    free(to_Release);
    to_Release = NULL;
}

额外的崩溃可能性排查

除了上面的核心问题,还有几种常见场景会导致free崩溃:

  • 重复释放:如果to_Release已经被释放过一次,再次调用free会直接触发崩溃
  • 指针被篡改:在分配和释放之间,Matrix指针被意外修改(比如被赋值为NULL,或者指向了栈内存)
  • 堆内存越界写入:在使用二维数组的过程中,越界写入了数据,破坏了堆的管理结构

按照上面修正后的代码实现,就能正确完成二维动态数组的内存释放,不会出现崩溃问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:46:29