【问题标题】:Dynamic allocation of 2D char array in CC中二维字符数组的动态分配
【发布时间】:2017-03-11 22:05:24
【问题描述】:

我知道每次添加项目时都使用 realloc 是个坏主意,但我只是想在这里学习内存管理。为什么这个程序会崩溃?

#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "some text";
char **stringList = (char**) malloc( sizeof(char*));

for (int n=0;n<15;n++){
stringList[n] = (char*) malloc( (strlen(str)+1) );
strcpy(stringList[n], str);
stringList=realloc(stringList, (n+2) * sizeof(char*));
n++;
}

return 0;
}

【问题讨论】:

  • 有no need 将调用结果转换为malloc()。
  • 你在循环中写了n++。这意味着n 将随着每次循环迭代增加 2。这是一个错误吗?
  • 每次重新分配就可以了
  • @BrandonIbbotson 这肯定是一个错误,因为第一个 realloc 分配 2 行,然后 stringlist[2] = 写入越界
  • 这种代码的正常结构是在 向新元素中添加内容之前执行realloc()。

标签: c multidimensional-array realloc


【解决方案1】:

它崩溃的原因是因为您将n 增加了两次。 n++ 在 for() 标头中有 n++,然后在循环的底部。

第一次通过循环一切正常。您对数组的初始分配有 1 个元素,您已设置 n = 0,因此分配给 stringList[n] 就可以了。

然后你做realloc(stringList, (n+2)*sizeof(char*))。现在数组有 2 个元素。

循环底部的n++ 设置n = 1,而for() 标头中的n++ 设置n = 2。

然后你回到循环体,并尝试分配给stringList[n]。这超出了数组范围,因为n = 2 和唯一有效的索引是stringList[0] 和stringList[1]。

这在循环中每隔一段时间重复一次,总是分配给刚刚结束的数组元素。在数组边界之外访问会导致未定义的行为,结果会导致崩溃。

去掉循环底部的n++,你应该没问题。

【讨论】:

  • 谢谢,我读了 10 遍代码,但没有注意到 n++,我想我需要睡觉
  • 当您在调试器中单步执行程序时,您是怎么错过的呢?您在此处发布之前确实尝试过使用调试器,不是吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-03
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2013-11-14
  • 2014-05-02
相关资源
最近更新 更多