我知道每次添加项目时使用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;
}
答案 0 :(得分:1)
它崩溃的原因是因为您需要两次递增n
。您在n++
标题中有for()
,然后在循环的底部再次显示。
第一次通过循环一切正常。您对数组的初始分配有1个元素,您已设置n = 0
,因此分配给stringList[n]
很好。
然后你做realloc(stringList, (n+2)*sizeof(char*))
。现在数组有2个元素。
n++
设置n = 1
,n++
标题集for()
中的n = 2
。
然后你回到循环体,并尝试分配给stringList[n]
。这是在数组边界之外,因为n = 2
和唯一有效的索引是stringList[0]
和stringList[1]
。
这通过循环每隔一段时间重复一次,总是在结束时分配给数组元素。访问数组边界之外会导致未定义的行为,并因此导致崩溃。
摆脱循环底部的n++
,你应该没问题。