>我正在尝试释放分配给 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);
最后,您使用了一维数组,您可以像其他答案一样释放分配的内存。