我正在尝试定义一个包含指向字符串的char指针的动态数组。字符串可以是任意长度,所以我使用了char指针。我希望每次需要存储更多值时动态调整数组大小。以下代码给出了分段错误。我做得好吗?
int main() {
char **input=NULL;
char *buffer;
int i=0;
do {
input = (char **)realloc(input, (i+1) * sizeof(char *));
scanf("%s", &buffer);
strcpy(input[i++],buffer);
} while(strlen(buffer)!=0);
}
答案 0 :(得分:8)
您的代码中存在多个问题。在你修复所有这些之后它才会起作用
buffer
分配内存。如果不是下一个可能更严重的点,那么Scanf会写入空气中。buffer
传递给scanf,而不是&buffer
input[i]
分配内存。你只是分配
input
的记忆。答案 1 :(得分:1)
缓冲区未初始化。除了& buffer是一个指向指针的指针,而不是你可能想要的字符数组。
答案 2 :(得分:1)
问题是您将buffer
定义为指针,但是您没有将其指向可以保存扫描字符串的内容,因此scanf
会在未分配的内存中写出非常糟糕的内容。您也不会分配input[i]
,因此strcpy
也会失败。您可能希望将其更改为使用strdup
代替:
input[i++] = strdup(buffer);
另外几个挑剔:当扫描一个字符串时,你不需要字符串缓冲区上的&
,所以重做这样:
scanf("%s", buffer);
并且你不应该将realloc
(或malloc
的结果投射到那个问题上):
input = realloc(input, (i+1) * sizeof(char *));
答案 3 :(得分:1)
除了已在其他答案中列出的问题之外,循环永远不会终止为:
scanf("%s", buffer);
在读取至少一个字符(不包括行尾字符)之前不会返回。
答案 4 :(得分:0)
您的缓冲区和输入[i]未分配。