在C中释放2D阵列的内存时出现异常警告

时间:2013-10-28 20:17:30

标签: c memory free multidimensional-array

我正在尝试释放我为2D阵列分配的内存。

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

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

    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*,但现在警告是:

转换为来自不同大小的整数

的指针

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

3 个答案:

答案 0 :(得分:2)

由于array是指向int的指针,因此array[i]int;尝试free(array[i])与尝试释放整数是一样的 - 这没有任何意义,这就是编译器所抱怨的。

假设这是一个保持整数的平面数组,你需要做的就是:

free(array);

答案 1 :(得分:2)

只需说free(array);无需释放数组的每个位置。在数组的每个位置,存储int,释放导致警告的int

如果你有二维数组,那么只有你的方式才有意义。

 //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]);
      }
}

答案 2 :(得分:0)

当您使用指针数组的指针时,您可以像问题一样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);

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