【发布时间】:2016-03-18 03:23:33
【问题描述】:
我正在尝试制作一个简单的程序,该程序使用 scanf 从标准输入中读取字符串并将它们放入字符串数组中(现在我只是使用 3 个单词对其进行测试,因此只有 3 个打印语句结尾)。我可以继续阅读,直到没有更多的字符串,但是我遇到了一个错误,在循环完成后,数组中的所有字符串都是最后一个读入的字符串。我尝试在其中放置一个 print 语句要调试的循环,它正在读取正确的字符串。但是,当循环完成时,数组中的所有字符串都是最后一个读入的字符串。谁能指出我在这里出错的地方?谢谢。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int c = 0;
char** w_arr = malloc(3*sizeof(char*));
char* w = malloc(10*sizeof(char));
while (scanf("%s", w) == 1) {
w_arr[c] = w;
//printf("%s", w_arr[c]); debug print statement
c++;
}
printf("%s, %s, %s\n", w_arr[0], w_arr[1], w_arr[2]);
return 0;
}
【问题讨论】:
-
您需要为每个
scanf提供malloc一个新的w缓冲区(或其他获取新缓冲区的方法,例如w_arr[c]=strdup(w))。事实上,所有数组条目都指向同一个缓冲区,每个scanf都会覆盖其内容。 -
啊。对不起,我是 c 的新手。所以基本上我在数组中的所有条目实际上都不是指向一个字符串,而是指向一个指针。那么当循环完成时,它们都指向同一个指针,也就是最后一个字符串的地址?
-
@PCR 这不是真正的“字符串地址”——它是内存中某个空间的地址。然后将第一个字符串读入该空间,并使
w_arr[0]指向该空间。然后将第二个字符串读入该空间,并使w_arr[1]指向该空间。然后将第三个字符串读入该空间,并使w_arr[2]指向该空间。最终结果是w_arr[0]、w_arr[1]和w_arr[2]都指向那个空间,并且那个空间包含第三个字符串(因为你覆盖了前两个)。
标签: c