我编写了以下 C 程序:
int main()
{
char a[1];
char b[6]="hello\0";
int c, i;
for(i = 0; (c = getchar()) != EOF; i++)
a[i] = c;
for(i = 0; i < 5; i++)
printf("%c", b[i]);
}
为什么当我在输入中给出“bye”时,程序打印“helby”? 我认为'b'应该保存在a[0]中,'y'应该保存在b[0]中,'e'应该保存在b[1]中。 谢谢您的建议!
最佳答案
您假设内存中 a
后面紧跟着 b
。情况不一定如此。
读取/写入超出数组末尾的是 undefined behavior ,因此编译器可以按照他们选择的任何顺序自由排列局部变量。
在我的特定机器上,如果 b
在 a
之前声明,则 a
出现在 b
之前内存,我得到你期望的输出。但是,正如您从其他答案和评论中看到的那样,由于未定义的行为,行为不可靠。
关于奇怪的数组覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39964746/