繁体   English   中英

如何在 C 中释放 malloc 的二维数组?

[英]How to free a malloc'd 2D array in C?

以下是我的代码,我无法弄清楚释放二维数组的问题所在。 我知道错误发生在这一行:free(arr[i]); 而且我也知道我必须先执行此循环以释放每个 integer ,然后再释放整个数组。 任何人都可以在这里发现错误吗? 我没有得到任何编译错误,但是一旦运行我的可执行文件,就会有一个巨大的回溯 output 用于免费的 function。

#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");
        }*/

}

您正在为arr[0] = (int*)malloc(sizeof(int) * w * h); 仅但在释放分配的空间时,您最多释放h个计数, for (i=0; i<h; i++){free(arr[i]);} 您也应该使用相同的循环以这种方式分配。

当您使用 malloc 时,您只分配数组的第一个 position

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

这意味着当您必须释放 memory 时,您需要先调用free(arr[0])然后再调用 free 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
}    

这将在数组中分配h指针以供使用,然后您可以像在示例中那样释放 memory

编辑:请注意,就像@AndrewHenle 在他的评论中正确指出的那样,此解决方案不会分配真正的二维数组,而只是分配指向 arrays 的指针数组。 有关正确分配 2D 数组的方法,请参阅相关问题

您在调用arr[0] = (int*)malloc(sizeof(int) * w * h); 对于整个二维数组来说已经足够了。 如果您想使用这种方法,即在对 malloc 的一次调用中为二维数组分配 memory,您可以通过将返回的指针转换为指向 w 元素的数组的指针来实现。 然后,您还可以在一次免费通话中释放 memory。 无需使用 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;
}

malloc function 不需要铸造。 除了不必要的,它还可能导致您出错。

关于 malloc function 的演员表: 我要转换 malloc 的结果吗?

最初我将 go 通过分配二维数组的基本方式:

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

int main()
{
    int h = 4;
    int w = 2;
    int i, j;
    int **arr = NULL; /* Good programming practice make a pointer point to NULL (nowhere) */

    /* first dimension */
    arr = malloc(h * sizeof(int *));

    /* second dimension */
    for (i = 0; i < h; i++) {
         arr[i] = malloc(w * sizeof(int));
    }

    /* code */        

    /* second dimension */
    for (i = 0; i < h; i++) {
        free(arr[i]);
    }
    /* first dimension */
    free(arr);

    return 0;
}

也可以用一个 malloc 分配malloc并用一个free命令分配空闲 memory:

int main()
{
    int h = 4;
    int w = 2;
    int i, j;
    int (*arr)[w] = NULL;

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

    /* code */

    free(arr);

    return 0;
}

或者,通过如上所述创建二维数组: int (*arr)[w] = NULL; , memory 分配也是这样工作的:

arr = malloc(h * sizeof *arr);

/* code */

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

free(arr);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM