0

我正在尝试释放我为二维数组分配的内存。

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

我尝试了 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])但警告说:

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

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

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

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

4

3 回答 3

2

因为array是指向 的指针int,所以array[i]int; 尝试free(array[i])与尝试释放整数相同 - 这是没有意义的,这就是编译器所抱怨的。

假设这是一个包含整数的平面数组,您需要做的就是释放它:

free(array);
于 2013-10-28T20:26:26.670 回答
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]);
      }
}
于 2013-10-28T20:27:26.580 回答
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);

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

于 2013-10-28T20:35:43.967 回答