C中2D char数组的动态分配

时间:2016-10-29 00:18:50

标签: c multidimensional-array realloc

我知道每次添加项目时使用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;
}

1 个答案:

答案 0 :(得分:1)

它崩溃的原因是因为您需要两次递增n。您在n++标题中有for(),然后在循环的底部再次显示。

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

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

循环底部的

n++设置n = 1n++标题集for()中的n = 2

然后你回到循环体,并尝试分配给stringList[n]。这是在数组边界之外,因为n = 2和唯一有效的索引是stringList[0]stringList[1]

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

摆脱循环底部的n++,你应该没问题。