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

问题描述 投票:0回答:5

以下是我的代码,我无法弄清楚释放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");
        }*/

}
c arrays multidimensional-array c99
5个回答
0
投票

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


0
投票

当您使用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 * h); // with the correct size you want
}    

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


0
投票

您正在通话中分配的内存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;
}

0
投票

最初,我将介绍分配二维数组的基本方法:

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

    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");
    }
    /* second dimension */
    for (i = 0; i < h; i++) {
        free(arr[i]);
    }
    /* first dimension */
    free(arr);

    return 0;
}

也可以用一个malloc分配内存,用一个free命令分配可用内存:

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

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

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

    return 0;
}

或者,通过如上所述创建二维数组:int (*arr)[w] = NULL;,内存分配也如下所示:

arr = malloc(h * sizeof *arr);

和:

free(arr);

返回malloc函数不需要强制转换。除了不必要的以外,可能会导致您出错。


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

free(arr);
© www.soinside.com 2019 - 2024. All rights reserved.