-1

使用此函数分配二维数组后:

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. 然而,charint上面的替换每个,断言失败就消失了。为什么会这样,然后我怎样才能释放整个二维数组?

4

4 回答 4

8

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

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

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

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

于 2013-01-22T02:44:42.717 回答
1

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

编辑:我看到有人打了我一拳。接受对方的回答。

于 2013-01-22T02:45:34.973 回答
0

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

像这样的东西:

void free_matrix(int M)
{
    for (in i = 0; i < M; i++)
    {
        free(MAT[i]);
    }
    free(MAT);
}
于 2013-01-22T02:46:38.547 回答
0

要释放空间(假设它已正确分配),您需要一个free()对应于每个调用的调用malloc()

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

当您在(32 位)系统上替换charintbecause时,您的代码可以工作。sizeof(int) == sizeof(int *)这在很大程度上是巧合。在 64 位系统上你又会遇到麻烦。

于 2013-01-22T02:49:43.273 回答