在 C 中解除分配 2D 数组内存时出现异常警告



>我正在尝试释放分配给 2D 数组的内存。

代码工作正常,但我在编译时总是有警告。

我尝试了 2 种不同的方法,但每次都会出现一个新警告。

    int* array = fillArray(); //malloc (n*m*sizeof*array)
    ...
    DeallocateMemory(array, n*m); //Where n and m are length and height
    void DeallocateMemory(int* array, int length)
    {
          for (int i = 0; i < length; i++){
              //free(array[i]);
              //free((void*)array[i]);
          }
    }
    free(array);

好吧,一开始,我写了free(array[i])但警告说:

*传递free的参数 1 使指针从整数不带强制转换注意:预期void*但参数的类型为 int*

所以我写了void*,但现在警告是:

从不同大小的整数强制转换为指针

我应该怎么做才能摆脱这两个错误?谢谢!

只需说free(array); 不需要释放数组的每个位置。在阵列的每个位置,都会存储一个int,以释放导致警告int

如果你有2D阵列,那么只有它像你那样有意义。

 //Allocate the memory
 int** array = malloc(n * sizeof(int*));
 for (unsigned int k = 0; k < n; k++) {
     array[k] = malloc(m * sizeof(int));
 }
 //Deallocate the memory
void DeallocateMemory(int** array, int n) {
      for (int i = 0; i < n; i++){
           free(array[i]);
      }
}

既然array是指向int的指针,那么array[i]是一个int;试图free(array[i])与试图释放一个整数是一样的——这是没有意义的,这就是编译器抱怨的。

假设这是一个保存整数的平面数组,要释放它所要做的就是:

free(array);

当你使用指针数组的指针时,你可以像在你的问题中一样free内存。我的意思是,如果您分配内存并像这样构建二维数组。

int **array = malloc(m * sizeof(int *));
for (i = 0; i < m; i++) { 
  array[i]=malloc(n * sizeof(int));
}

然后你可以像这样释放所有分配的内存。

for (i = 0; i < m; i++) { 
  free(array[i]);
}
free(array);

最后,您使用了一维数组,您可以像其他答案一样释放分配的内存。

最新更新