C 释放二维字符数组
使用此函数分配二维阵列后:C 释放二维字符数组,c,malloc,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; } char**make_矩阵(int M,int N) { char*
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;
}
char**make_矩阵(int M,int N)
{
char**MAT=(char**)malloc(M*sizeof(char));
for(int i=0;i
我发现尝试
释放(M[0])
会导致断言失败。我能找到的关于释放二维数组的所有内容都使用int
而不是char
。然而,用上面的int
替换每个char
,断言失败就会消失。为什么会这样?我怎样才能释放整个二维阵列 为MAT
分配的内存太少。将相关行更改为:
char** MAT = (char**)malloc(M * sizeof(char*));
这是因为MAT是指针数组,而不是字符数组。因为您的代码没有分配足够的内存,所以很可能是在数组边界之外写入并损坏内存
它可以处理整数,因为它们更大,所以如果运气好的话,您可以分配足够的内存(至少在32位机器上)。第一个malloc调用是M*sizeof(char),而不是sizeof(char*)。sizeof(char)将是1个字节,char*的大小可能是4个字节
编辑:我看到有人打了我一拳。接受另一个人的答案。你应该遍历矩阵的所有行,首先释放它们,最后释放矩阵 大概是这样的:
void free_matrix(int M)
{
for (in i = 0; i < M; i++)
{
free(MAT[i]);
}
free(MAT);
}
void free_矩阵(int M)
{
for(在i=0;i
要释放空间(假设空间分配正确),需要调用free()
,对应于对malloc()
的每次调用
void destroy\u矩阵(字符**MAT,整数M)
{
for(int i=0;i
当您用
int
替换char
时,您的代码可以工作,因为在您的(32位)系统上sizeof(int)==sizeof(int*)
。这在很大程度上是巧合;在64位系统上,您将再次遇到麻烦。是的,您应该使MAT=(char**)malloc(Msizeof(char))那么这是否意味着由于使用int**MAT=(int**)malloc(M*sizeof(int))是可以的,int指针需要与int相同的内存量?您不应该假设类型大小取决于体系结构。在32位ARCH上,int和指针的长度通常为4字节,但在64位Linux上,指针的长度更大(8字节)。更重要的是,如果坏掉的代码没有崩溃,那可能纯粹是运气使然。哦,谢谢,我想到目前为止,我只是幸运地在我应该使用int的地方使用int*
void destroy_matrix(char **MAT, int M)
{
for (int i = 0; i < M; i++)
free(MAT[i]);
free(MAT);
}