【问题标题】:Free() from 2 dimensional array来自二维数组的 Free()
【发布时间】: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+20x_max+1 包括在内)。在大多数情况下,您确实想要在 C 中的 for 循环中使用 &lt;=
  • tab = calloc(x_max+1, sizeof(int)); for(j = 0; j &lt;=x_max+1; j++) --> tab = calloc(x_max+1, sizeof(int*)); for(j = 0; j &lt;x_max+1; j++)
  • @cokceken 嗯?那是无效的 C。数组索引需要在 [] 之间的索引。
  • @tuple_cat 你说得对,我删除了我的评论
  • 您的代码中没有二维数组。 int ** 之类的东西不是也不能指向二维数组。使用二维数组。

标签: c arrays dynamic-memory-allocation


【解决方案1】:

首先,它不是二维数组。这是一个锯齿状数组。

您的初始分配有问题。您想分配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() 的返回值是否失败。

【讨论】:

  • 代码可以使用tab = calloc(x_max+1, sizeof *tab);tab[j] = calloc(y_max+2, sizeof *(tab[j]));,以获得更简单的代码。编码错误的可能性更低,更易于查看和更新​​。
  • 如何检查它是否为NULL?这个可以吗? if (tab==NULL)
  • @sswwqqaa 是的,没关系。同样,也要检查循环内完成的分配。
猜你喜欢
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 2010-10-01
  • 1970-01-01
  • 2012-03-22
  • 2013-11-08
相关资源
最近更新 更多