2维数组中的Free()

时间:2016-12-30 13:19:47

标签: c arrays dynamic-memory-allocation

我试图以相同的方式从二维数组释放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结束)

1 个答案:

答案 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()的失败返回值。