【发布时间】:2020-06-08 06:03:24
【问题描述】:
我知道在我的 C 代码的内存使用下存在一个简单的错误,因为在命令行上接收到用户输入后,简单 for 循环中的迭代器发生了巨大变化:
int i = 1;
char input[] = "";
for (i = 1; i <= 5; i++) {
printf("i %d\n> ", i);
scanf("%s", input);
printf("input %s\ni %d\n", input, i);
}
输出应该足够简单:
i 1
> <receive input>
input <input>
i 1
重复5次。
但是,迭代器“i”会更改为任何内容,而不是收到任何输入时的预期值。
示例输出:
i 1
> 45
input 45
i 53
我有一种预感,这来自编译器中的内存访问。有什么帮助!
【问题讨论】:
-
回想一下,每个 C 字符串都必须为 nul-terminating 字符
'\0'(ASCII0) 提供空间,这需要在字符串末尾增加 1 个字符除了您打算存储的每个字符。 (这就是函数如何知道字符串的结尾在哪里...)char input[] = "";声明并将 1-char 数组初始化为 empty-string (只是'\0'字符)。一旦声明数组大小是固定的,所以它永远不能存储字符串(empty-string除外),最多可以存储1个字符(字节)。 -
另外,除非您检查返回,否则您无法正确使用任何输入功能。 Using scanf Correctly 的基本解释可能会有所帮助。