我试图以相同的方式从二维数组释放mem:[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);
这似乎与上面链接中的示例相似,但是我的程序一直在崩溃(当我评论释放mem部分时一切正常。)此外,当我尝试逐行调试程序时,一切正常。 (调试器以状态0结束)
答案 0 :(得分:1)
首先,它不是2D阵列。它是一个锯齿状的数组。
您的初始分配存在问题。您想要分配x_max+1
指针,而不是int
s。你分配了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()
的失败返回值。