【发布时间】:2019-01-28 23:34:36
【问题描述】:
我正试图找出我的代码中的一个错误,但由于某种原因,scanf() 循环之后数组似乎变得很奇怪。
这可能是什么原因?
我输入的输入是“a”、“b”、“c”。 这是控制台的输出:
all element are: a
all element are: b
all element are: c
s: c
after loop1: c
after loop3: c
s_arr 在循环完成后更改。
这是我的代码:
int main() {
char s[5];
char *s_arr[3];
for(int i=0; i<3; i++){
scanf("%s\n", s);
s_arr[i] = s;
printf("all element are: %s\n", s_arr[i]);
}
printf("s: %s\n", s);
printf("after loop1: %s\n", s_arr[0]);
printf("after loop3: %s\n", s_arr[2]);
return 0;
}
【问题讨论】:
-
s_arr[i] = s不会不复制字符串。如果你printf("%p\n", s_arr[i])你会发现s_arr中的所有指针都指向同一个地址,也就是s的地址。 -
你的程序中只有一个字符串
char s[5]。你也有 3 个指向字符串的指针。但它们最终指向同一个字符串。 -
这甚至编译没有警告?
-
scanf("%s\n", s);是非常糟糕的代码。格式字符串中的\n会导致违反直觉的行为(使用户感到困惑),并且缺少返回值检查意味着您不知道scanf是否真的设法读取了任何内容。另外,没有输入限制,所以那里存在缓冲区溢出错误。 -
什么意思,循环后数组变奇怪了?循环内部和外部的变量没有区别。输出与此一致。
标签: c