使用此功能分配二维数组后:
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
,断言失败就会消失。为什么这样,我怎么能释放整个二维阵列?
答案 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位系统上再次陷入困境。