二维数组中的 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 值是否失败。