二维数组中的 Free()
Free() from 2 dimensional array
我正在尝试从二维数组中释放内存,就像这样:[C: Correctly freeing memory of a multi-dimensional array
//initialization
int **tab;
int i,j;
int x_max=5,y_max=7;
tab = calloc(x_max+1, sizeof(int));
for(j = 0; j <=x_max+1; j++)
{
tab[j] = calloc(y_max+2, sizeof(int));
}
比:
for (i = 0; i <=x_max+1; i++)
{
free(tab[i]);
}
free(tab);
这似乎与上面的示例相同 link,但是我的程序一直崩溃(当我评论释放内存部分时一切正常。)此外,当我尝试逐行调试程序时一切正常. (调试器已完成,状态为 0)
首先,它不是二维数组。这是一个 锯齿状 数组。
您的初始分配有问题。你想分配 x_max+1
个指针,而不是 int
个。自从您分配了 x_max+1
个指针以来,您正在访问范围之外,但最多可以访问 x_max+2
个指针。
通常首选使用事物本身来分配内存,例如:
tab = calloc(x_max+1, sizeof *tab);
这样您就不用担心以后类型会被更改了。
tab = calloc(x_max+1, sizeof(int));
for(j = 0; j <=x_max+1; j++)
{
tab[j] = calloc(y_max+2, sizeof(int));
}
应该是
tab = calloc(x_max+1, sizeof *tab); /* equivalent to: tab = calloc(x_max+1, sizeof(int*)); */
for(j = 0; j < x_max+1; j++)
{
tab[j] = calloc(y_max+2, sizeof(int));
}
您还应该检查 calloc()
的 return 值是否失败。
我正在尝试从二维数组中释放内存,就像这样:[C: Correctly freeing memory of a multi-dimensional array
//initialization
int **tab;
int i,j;
int x_max=5,y_max=7;
tab = calloc(x_max+1, sizeof(int));
for(j = 0; j <=x_max+1; j++)
{
tab[j] = calloc(y_max+2, sizeof(int));
}
比:
for (i = 0; i <=x_max+1; i++)
{
free(tab[i]);
}
free(tab);
这似乎与上面的示例相同 link,但是我的程序一直崩溃(当我评论释放内存部分时一切正常。)此外,当我尝试逐行调试程序时一切正常. (调试器已完成,状态为 0)
首先,它不是二维数组。这是一个 锯齿状 数组。
您的初始分配有问题。你想分配 x_max+1
个指针,而不是 int
个。自从您分配了 x_max+1
个指针以来,您正在访问范围之外,但最多可以访问 x_max+2
个指针。
通常首选使用事物本身来分配内存,例如:
tab = calloc(x_max+1, sizeof *tab);
这样您就不用担心以后类型会被更改了。
tab = calloc(x_max+1, sizeof(int));
for(j = 0; j <=x_max+1; j++)
{
tab[j] = calloc(y_max+2, sizeof(int));
}
应该是
tab = calloc(x_max+1, sizeof *tab); /* equivalent to: tab = calloc(x_max+1, sizeof(int*)); */
for(j = 0; j < x_max+1; j++)
{
tab[j] = calloc(y_max+2, sizeof(int));
}
您还应该检查 calloc()
的 return 值是否失败。