如何释放malloc';C中的2D数组?
以下是我的代码,我无法找出释放2d数组的错误位置。 我知道错误发生在这一行:free(arr[I]);我还知道,在释放整个数组之前,我必须执行这个循环来释放每个整数。有人能在这里发现虫子吗?我没有得到编译错误,但一旦运行我的可执行文件,自由函数就会有一个巨大的回溯输出如何释放malloc';C中的2D数组?,c,arrays,multidimensional-array,c99,C,Arrays,Multidimensional Array,C99,以下是我的代码,我无法找出释放2d数组的错误位置。 我知道错误发生在这一行:free(arr[I]);我还知道,在释放整个数组之前,我必须执行这个循环来释放每个整数。有人能在这里发现虫子吗?我没有得到编译错误,但一旦运行我的可执行文件,自由函数就会有一个巨大的回溯输出 #include <stdio.h> #include <stdlib.h> int main() { int h = 4; int w = 2; int
#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");
}*/
}
#包括
#包括
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);
对于(i=1;i您只为arr[0]=(int*)malloc(sizeof(int)*w*h);
分配内存,但在释放分配的空间时,您最多释放h
计数,对于(i=0;i//(i=0;i当您使用malloc时,您只分配数组的第一个位置
arr[0]=(int*)malloc(sizeof(int)*w*h);
这意味着当您必须释放内存时,您需要调用free(arr[0])
,然后调用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
}
int**arr=(int**)malloc(sizeof(int*)*h);
对于(int i=1;i
这将在数组中分配h
指针以供使用,然后您可以像在示例中那样释放内存
编辑:请注意,如@AndrewHenle在其评论中正确指出的,此解决方案不分配true2D数组,而只分配指向数组的指针数组。有关正确分配2D数组的方法,请参阅相关问题您在调用中分配的内存
arr[0]=(int*)malloc(sizeof(int)*w*h);
对于整个2D数组已经足够了。如果您想使用这种方法,即在一次调用malloc时为2D数组分配内存,可以通过将返回的指针转换为指向w元素数组的指针来实现。然后您还可以在一次调用中释放内存以释放。无需使用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;
}
intmain()
{
int h=4;
int w=2;
int i,j;
int(*arr)[w]=(int(*)(w])malloc(sizeof(int)*h*w);//指向w int数组的指针
整数计数=0;
对于(i=0;i您呼叫malloc
两次,但您呼叫free
超过两次……他们必须匹配您是说我在循环中多次呼叫free?我应该如何正确地执行?在我在线查看的所有其他地方,都需要此循环来释放每个人。)integer@camillesmith99大师是M,M,意思是你不给任何人打电话de>malloc
s在一个循环中,而您在一个循环中调用free
。也就是说,代码部分似乎只是一个传真,没有掌握其基本逻辑。在我的代码的这一部分中,我创建了数组```的行(I=1;I谢谢您,这很有帮助。释放数组的正确方法是:free(arr[0]);//释放内层空闲(arr);//释放外层空闲(我调用的每个malloc都有一个)?只使用代码的答案通常被认为是低质量的。你能为你的答案添加一个解释吗。我不懂英语。你可能想在第二行找到更多的解决方案不。只有两个malloc()的解决方案
调用效率更高。在循环中多次调用malloc()
不是一个“二维数组”-它是指向一维数组的指针数组。有关真正的动态分配多维数组,请参阅@AndrewHenle,我知道。我在回答中从来没有写过我使用二维数组的地方,我写过我的答案“将在数组中分配h
指针以供使用”,这正是指向一维数组的指针数组“就像你写的那样。在他的例子中,他试图释放内存,我想他想要的是一个更符合我所写内容的解决方案,而不是一个真正的2D数组。我将在我的答案中添加一个编辑,以更好地反映这一点
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;
}