【发布时间】:2017-05-14 19:08:14
【问题描述】:
我正在尝试以与以下相同的方式从二维数组中释放内存:[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 完成)
【问题讨论】:
-
您在 创建 表示数组时有未定义的行为(在释放它时重复,但到那时,由于早期的 UB,它不再重要)。您分配
x_max+1元素,但您访问x_max+2(0到x_max+1包括在内)。在大多数情况下,您确实不想要在 C 中的for循环中使用<=。 -
tab = calloc(x_max+1, sizeof(int)); for(j = 0; j <=x_max+1; j++)-->tab = calloc(x_max+1, sizeof(int*)); for(j = 0; j <x_max+1; j++) -
@cokceken 嗯?那是无效的 C。数组索引需要在
[和]之间的索引。 -
@tuple_cat 你说得对,我删除了我的评论
-
您的代码中没有二维数组。
int **之类的东西不是也不能指向二维数组。使用二维数组。
标签: c arrays dynamic-memory-allocation