我正试图像这样从二维数组中释放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
指针,而不是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()
的返回值是否有故障。关于c - 来自二维数组的Free(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41396958/