释放2-d char数组

时间:2013-01-22 02:42:58

标签: c malloc

使用此功能分配二维数组后:

char** make_matrix(int M, int N)
{
    char** MAT = (char**)malloc(M * sizeof(char));
    for (int i = 0; i < M; i++)
    {
        MAT[i] = (char*)malloc(N * sizeof(char));
    }
    return MAT;
}

我发现尝试free(M[0])导致断言失败。我能找到的关于释放二维数组的所有内容都使用int而不是char。然而,用char替换每个int,断言失败就会消失。为什么这样,我怎么能释放整个二维阵列?

4 个答案:

答案 0 :(得分:8)

您为MAT分配的内存太少。将相关行更改为:

char** MAT = (char**)malloc(M * sizeof(char*));

这是因为MAT是指针数组,而不是字符。由于您的代码没有分配足够的内存,因此很可能在数组边界之外写入并破坏内存。

它可以与整数一起工作,因为它们更大,所以运气好的话,你可以分配足够的内存(至少在32位机器上)。

答案 1 :(得分:1)

第一个malloc调用是M * sizeof(char)而不是sizeof(char *)。 sizeof(char)为1个字节,char *的大小可能为4个字节。

编辑:我看到有人打败了我。接受另一个人的回答。

答案 2 :(得分:0)

你应该遍历矩阵的所有行并首先释放它们,然后最后释放MAT

类似的东西:

void free_matrix(int M)
{
    for (in i = 0; i < M; i++)
    {
        free(MAT[i]);
    }
    free(MAT);
}

答案 3 :(得分:0)

要释放空间(假设分配正确),您需要拨打与free()每次通话相对应的malloc()

void destroy_matrix(char **MAT, int M)
{
    for (int i = 0; i < M; i++)
        free(MAT[i]);
    free(MAT);
}

当您将char替换为int因为{32}系统上的sizeof(int) == sizeof(int *)时,您的代码会正常工作。这主要是巧合;你在64位系统上再次陷入困境。