繁体   English   中英

释放二维char数组

[英]Freeing a 2-d char array

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

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 ,断言失败就消失了。 为什么会这样,然后如何释放整个二维数组?

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

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

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

它可以与整数一起使用,因为它们更大,因此如果运气好的话,您可能只分配了足够的内存(至少在32位计算机上)。

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

编辑:我看到有人击败了我。 接受对方的回答。

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

像这样的东西:

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

要释放空间(假设已正确分配空间),您需要对free()进行调用,该调用对应于对malloc()每次调用。

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

当您用int替换char时,您的代码可以正常工作,因为(32位)系统上的sizeof(int) == sizeof(int *) 很大程度上是巧合; 您将在64位系统上再次遇到麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM