Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
如何释放malloc';C中的2D数组?_C_Arrays_Multidimensional Array_C99 - Fatal编程技术网

如何释放malloc';C中的2D数组?

如何释放malloc';C中的2D数组?,c,arrays,multidimensional-array,c99,C,Arrays,Multidimensional Array,C99,以下是我的代码,我无法找出释放2d数组的错误位置。 我知道错误发生在这一行:free(arr[I]);我还知道,在释放整个数组之前,我必须执行这个循环来释放每个整数。有人能在这里发现虫子吗?我没有得到编译错误,但一旦运行我的可执行文件,自由函数就会有一个巨大的回溯输出 #include <stdio.h> #include <stdlib.h> int main() { int h = 4; int w = 2; int

以下是我的代码,我无法找出释放2d数组的错误位置。 我知道错误发生在这一行:free(arr[I]);我还知道,在释放整个数组之前,我必须执行这个循环来释放每个整数。有人能在这里发现虫子吗?我没有得到编译错误,但一旦运行我的可执行文件,自由函数就会有一个巨大的回溯输出

#include <stdio.h>
#include <stdlib.h>

int main()
{
        int h = 4;
        int w = 2;
        int i, j;

        int **arr = (int**)malloc(sizeof(int*) * h);
        arr[0] = (int*)malloc(sizeof(int) * w * h);

        for (i=1; i<h; i++)
        {
                arr[i] = arr[0] + (w*i);
        }

        int count = 0;
        for (i=0; i<h; i++)
        {
                for (j=0; j<w; j++)
                {
                        arr[i][j] = count++;
                }
        }


        for (i=0; i<h; i++)
        {
                for (j=0; j<w; j++)
                {
                        printf("Array[%d][%d] = %d ", i, j, arr[i][j]);
                }
                printf("\n");
        }

        for (i=0; i<h; i++)
        {
                free(arr[i]);
        }

        free(arr);

        /*printf("\nAfter freeing the array it becomes:\n");
        for (i=0; i<h; i++)
        {
                for (j=0; j<w; j++)
                {
                        printf("Array[%d][%d] = %d ", i, j, arr[i][j]);
                }
                printf("\n");
        }*/

}
#包括
#包括
int main()
{
int h=4;
int w=2;
int i,j;
int**arr=(int**)malloc(sizeof(int*)*h);
arr[0]=(int*)malloc(sizeof(int)*w*h);

对于(i=1;i您只为
arr[0]=(int*)malloc(sizeof(int)*w*h);
分配内存,但在释放分配的空间时,您最多释放
h
计数,
对于(i=0;i
//(i=0;i当您使用malloc时,您只分配数组的第一个位置

arr[0]=(int*)malloc(sizeof(int)*w*h);

这意味着当您必须释放内存时,您需要调用
free(arr[0])
,然后调用
free(arr)

这不会给你一个错误

无论如何,我不认为这是你想要做的。你可能想要一个解决方案,更多的是:

int **arr = (int**)malloc(sizeof(int*) * h);

for (int i = 1; i < h ; ++i){
     arr[i] = (int*)malloc(sizeof(int) * w); // with the correct size you want
}    
int**arr=(int**)malloc(sizeof(int*)*h);
对于(int i=1;i
这将在数组中分配
h
指针以供使用,然后您可以像在示例中那样释放内存


编辑:请注意,如@AndrewHenle在其评论中正确指出的,此解决方案不分配true2D数组,而只分配指向数组的指针数组。有关正确分配2D数组的方法,请参阅相关问题

您在调用中分配的内存
arr[0]=(int*)malloc(sizeof(int)*w*h);
对于整个2D数组已经足够了。如果您想使用这种方法,即在一次调用malloc时为2D数组分配内存,可以通过将返回的指针转换为指向w元素数组的指针来实现。然后您还可以在一次调用中释放内存以释放。无需使用for循环。请参阅下面的代码

int main()
{
    int h = 4;
    int w = 2;
    int i, j;

    int (*arr)[w] = (int(*)[w])malloc(sizeof(int)*h*w); // pointer to array of w ints

    int count = 0;
    for (i=0; i<h; i++) {
        for (j=0; j<w; j++) {
            arr[i][j] = count++;
        }
    }

    for (i=0; i<h; i++) {
        for (j=0; j<w; j++) {
            printf("Array[%d][%d] = %d ", i, j, arr[i][j]);
        }
        printf("\n");
    }

    free(arr);  //<-- free the 2D array in a single free
    return 0;
}
intmain()
{
int h=4;
int w=2;
int i,j;
int(*arr)[w]=(int(*)(w])malloc(sizeof(int)*h*w);//指向w int数组的指针
整数计数=0;

对于(i=0;i您呼叫
malloc
两次,但您呼叫
free
超过两次……他们必须匹配您是说我在循环中多次呼叫free?我应该如何正确地执行?在我在线查看的所有其他地方,都需要此循环来释放每个人。)integer@camillesmith99大师是M,M,意思是你不给任何人打电话de>malloc
s在一个循环中,而您在一个循环中调用
free
。也就是说,代码部分似乎只是一个传真,没有掌握其基本逻辑。在我的代码的这一部分中,我创建了数组```的行(I=1;I谢谢您,这很有帮助。释放数组的正确方法是:free(arr[0]);//释放内层空闲(arr);//释放外层空闲(我调用的每个malloc都有一个)?只使用代码的答案通常被认为是低质量的。你能为你的答案添加一个解释吗。我不懂英语。你可能想在第二行找到更多的解决方案不。只有两个malloc()的解决方案
调用效率更高。在循环中多次调用
malloc()
不是一个“二维数组”-它是指向一维数组的指针数组。有关真正的动态分配多维数组,请参阅@AndrewHenle,我知道。我在回答中从来没有写过我使用二维数组的地方,我写过我的答案“将在数组中分配
h
指针以供使用”,这正是指向一维数组的指针数组“就像你写的那样。在他的例子中,他试图
释放
内存,我想他想要的是一个更符合我所写内容的解决方案,而不是一个真正的2D数组。我将在我的答案中添加一个编辑,以更好地反映这一点
int main()
{
    int h = 4;
    int w = 2;
    int i, j;

    int (*arr)[w] = (int(*)[w])malloc(sizeof(int)*h*w); // pointer to array of w ints

    int count = 0;
    for (i=0; i<h; i++) {
        for (j=0; j<w; j++) {
            arr[i][j] = count++;
        }
    }

    for (i=0; i<h; i++) {
        for (j=0; j<w; j++) {
            printf("Array[%d][%d] = %d ", i, j, arr[i][j]);
        }
        printf("\n");
    }

    free(arr);  //<-- free the 2D array in a single free
    return 0;
}