奇怪的数组覆盖

标签 c overwrite

我编写了以下 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 ,因此编译器可以按照他们选择的任何顺序自由排列局部变量。

在我的特定机器上,如果 ba 之前声明,则 a 出现在 b 之前内存,我得到你期望的输出。但是,正如您从其他答案和评论中看到的那样,由于未定义的行为,行为不可靠。

关于奇怪的数组覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39964746/

相关文章:

更改C中的指针

c - 试图进行微基准测试的结果不一致

java - 如何避免覆盖java中的按钮文本?

OpenCV 将不同名称的图像写入磁盘

c - 如何在图形模式下移动到位置

c - 在线程中使用共享内存

c - 声明一个字符指针数组(arg 传递)

Java - 最后创建的对象覆盖前一个对象

CSS id 元素覆盖其子元素的定义

c++ - 是否允许在 Base 的实例上编写 Derived 的实例?