我正试图像这样从二维数组中释放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);

这似乎与上面链接中的示例类似,但我的程序不断崩溃(当我注释freing mem part时,一切正常。)同时,当我尝试逐行调试程序时,一切正常。(调试器已完成,状态为0)

最佳答案

首先,它不是二维数组。这是一个锯齿状的阵列。
你最初的分配有问题。您要分配x_max+1指针,而不是ints。由于您分配了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()的返回值是否有故障。

关于c - 来自二维数组的Free(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41396958/

10-10 13:20