[英]How to free a malloc'd 2D array in C?
以下是我的代码,我无法弄清楚释放二维数组的问题所在。 我知道错误发生在这一行:free(arr[i]); 而且我也知道我必须先执行此循环以释放每个 integer ,然后再释放整个数组。 任何人都可以在这里发现错误吗? 我没有得到任何编译错误,但是一旦运行我的可执行文件,就会有一个巨大的回溯 output 用于免费的 function。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int h = 4;
int w = 2;
int i, j;
int **arr = (int**)malloc(sizeof(int*) * h);
arr[0] = (int*)malloc(sizeof(int) * w * h);
for (i=1; i<h; i++)
{
arr[i] = arr[0] + (w*i);
}
int count = 0;
for (i=0; i<h; i++)
{
for (j=0; j<w; j++)
{
arr[i][j] = count++;
}
}
for (i=0; i<h; i++)
{
for (j=0; j<w; j++)
{
printf("Array[%d][%d] = %d ", i, j, arr[i][j]);
}
printf("\n");
}
for (i=0; i<h; i++)
{
free(arr[i]);
}
free(arr);
/*printf("\nAfter freeing the array it becomes:\n");
for (i=0; i<h; i++)
{
for (j=0; j<w; j++)
{
printf("Array[%d][%d] = %d ", i, j, arr[i][j]);
}
printf("\n");
}*/
}
您正在为arr[0] = (int*)malloc(sizeof(int) * w * h);
仅但在释放分配的空间时,您最多释放h
个计数, for (i=0; i<h; i++){free(arr[i]);}
。 您也应该使用相同的循环以这种方式分配。
当您使用 malloc 时,您只分配数组的第一个 position
arr[0] = (int*)malloc(sizeof(int) * w * h);
这意味着当您必须释放 memory 时,您需要先调用free(arr[0])
然后再调用 free free(arr)
这不会给你一个错误。
无论如何,我不认为这是你想要做的。 您可能需要更多以下方面的解决方案:
int **arr = (int**)malloc(sizeof(int*) * h);
for (int i = 1; i < h ; ++i){
arr[i] = (int*)malloc(sizeof(int) * w); // with the correct size you want
}
这将在数组中分配h
指针以供使用,然后您可以像在示例中那样释放 memory
编辑:请注意,就像@AndrewHenle 在他的评论中正确指出的那样,此解决方案不会分配真正的二维数组,而只是分配指向 arrays 的指针数组。 有关正确分配 2D 数组的方法,请参阅此相关问题
您在调用arr[0] = (int*)malloc(sizeof(int) * w * h);
对于整个二维数组来说已经足够了。 如果您想使用这种方法,即在对 malloc 的一次调用中为二维数组分配 memory,您可以通过将返回的指针转换为指向 w 元素的数组的指针来实现。 然后,您还可以在一次免费通话中释放 memory。 无需使用 for 循环。 请参阅下面的代码。
int main()
{
int h = 4;
int w = 2;
int i, j;
int (*arr)[w] = (int(*)[w])malloc(sizeof(int)*h*w); // pointer to array of w ints
int count = 0;
for (i=0; i<h; i++) {
for (j=0; j<w; j++) {
arr[i][j] = count++;
}
}
for (i=0; i<h; i++) {
for (j=0; j<w; j++) {
printf("Array[%d][%d] = %d ", i, j, arr[i][j]);
}
printf("\n");
}
free(arr); //<-- free the 2D array in a single free
return 0;
}
malloc function 不需要铸造。 除了不必要的,它还可能导致您出错。
关于 malloc function 的演员表: 我要转换 malloc 的结果吗?
最初我将 go 通过分配二维数组的基本方式:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int h = 4;
int w = 2;
int i, j;
int **arr = NULL; /* Good programming practice make a pointer point to NULL (nowhere) */
/* first dimension */
arr = malloc(h * sizeof(int *));
/* second dimension */
for (i = 0; i < h; i++) {
arr[i] = malloc(w * sizeof(int));
}
/* code */
/* second dimension */
for (i = 0; i < h; i++) {
free(arr[i]);
}
/* first dimension */
free(arr);
return 0;
}
也可以用一个 malloc 分配malloc
并用一个free
命令分配空闲 memory:
int main()
{
int h = 4;
int w = 2;
int i, j;
int (*arr)[w] = NULL;
arr = malloc(h * w * sizeof(int));
/* code */
free(arr);
return 0;
}
或者,通过如上所述创建二维数组: int (*arr)[w] = NULL;
, memory 分配也是这样工作的:
arr = malloc(h * sizeof *arr);
/* code */
free(arr);
//for (i=0; i<h; i++) { free(arr[i]); }//error
free(arr[0]); //true
free(arr);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.