C中二维字符数组的动态分配

Dynamic allocation of 2D char array in C

我知道每次添加项目时都使用 realloc 是个坏主意,但我只是想学习内存管理 here.Why 这个程序会崩溃吗?

#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;
}

它崩溃的原因是你递增了 n 两次。您在 for() header 中有 n++,然后在循环的底部再次出现。

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

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

循环底部的

n++设置n = 1,而for()header中的n++设置n = 2.

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

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

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