[英]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.