Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 释放二维字符数组_C_Malloc - Fatal编程技术网

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);
}