如何在C中释放2D阵列内存

时间:2018-11-25 10:12:58

标签: c arrays pointers heap-memory

我正在尝试为2D阵列分配内存。但是,当我尝试释放内存时,它将引发分段错误。请帮助我知道我在做什么错吗?

  int **arr1 = (int **) malloc (rows * columns * sizeof (int));

  //Array Access:
  for (i = 0; i < rows; i++)
    for (j = 0; j < columns; j++)
      *(arr1 + i * columns + j) = ++count;

  for (i = 0; i < rows; i++)
    for (j = 0; j < columns; j++)
      printf ("%d", *(arr1 + i * columns + j));

  for (i = 0; i < rows*columns; i++)
    free (arr1[i]);

3 个答案:

答案 0 :(得分:3)

您似乎正在尝试将一个指针数组分配给数组。因为free未分配的内存,所以代码段出错。分配“ 2D数组”的正确方法更像是这样:

int **arr1 = malloc (rows * sizeof (int*));

for (int r = 0; r < rows; r++)
  arr1[r] = malloc(columns * sizeof(int));

...

for (int r = 0; r < rows; r++)
  free(arr1[r]);

free(arr1);

答案 1 :(得分:2)

一个简单的经验法则是,每个malloc应该有一个free。您已经分配了arr1所指向的内存块,因此您应该释放该一个内存块。

free(arr1);

您不能零碎地释放一块内存。如果要这样做,则需要分别分配每一行,但也可以将单个内存作为2D数组使用。如果每行的大小未知,则分配每行更好。如果行大小固定,则较大的分配会更好。


此外,arr1应该是单指针,而不是双指针。编译器警告应该已经对此发出警告。

int *arr1 = malloc (rows * columns * sizeof(int));

double pointer是指向指针的指针。不必使用双指针来假装指针是2D矩阵。

答案 2 :(得分:1)

您可以遍历每一行,并在每次迭代时,可以在创建阶段分配空间,并在清除阶段自行释放空间。您的代码有几个问题,我认为这可能是一种更好的编写方式,例如:

int **array = (int**) malloc( row * sizeof(int*)), i = 0, j;

for( ; i < row; i++){
    *(array + i)  = (int*) malloc(col * sizeof(int));
    for( j = 0; j < col; j++){
        *(*(array + i) + j) = i * row + j;
    }
}

这将创建二维数组,其值按升序排列。

释放时:

for(i = 0 ; i < row; i++){
    free(*(array + i));
}
free(array);