以下是我的代码,我无法弄清楚释放2d数组出错的地方。我知道错误发生在这一行:free(arr [i]);我也知道我必须执行此循环以释放每个整数,然后再释放整个数组。有人可以在这里发现错误吗?我没有编译错误,但是一旦运行我的可执行文件,自由函数就会有巨大的回溯输出。
#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时,您仅分配数组的第一个位置
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 * h); // with the correct size you want
}
这将在数组中分配h
指针供使用,然后您可以像在示例中那样释放内存
您正在通话中分配的内存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;
}
最初,我将介绍分配二维数组的基本方法:
#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));
}
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");
}
/* second dimension */
for (i = 0; i < h; i++) {
free(arr[i]);
}
/* first dimension */
free(arr);
return 0;
}
也可以用一个malloc
分配内存,用一个free
命令分配可用内存:
int main()
{
int h = 4;
int w = 2;
int i, j;
int (*arr)[w] = NULL;
arr = malloc(h * w * sizeof(int));
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);
return 0;
}
或者,通过如上所述创建二维数组:int (*arr)[w] = NULL;
,内存分配也如下所示:
arr = malloc(h * sizeof *arr);
和:
free(arr);
返回malloc函数不需要强制转换。除了不必要的以外,可能会导致您出错。
//for (i=0; i<h; i++) { free(arr[i]); }//error
free(arr[0]); //true
free(arr);