奇怪的数组覆盖

时间:2016-10-10 18:42:06

标签: c overwrite

我写了以下c程序:

PyObject*

为什么当我在输入程序中输入“bye”打印“helby”时? 我认为'b'应保存在[0]中,'y'保存在b [0]中,'e'保存在b [1]中。 谢谢你的建议!

2 个答案:

答案 0 :(得分:1)

您认为a内存后紧跟b。情况不一定如此。

读取/写入数组的末尾是undefined behavior,因此编译器可以按他们选择的任何顺序自由排列局部变量。

在我的特定计算机上,如果在b之前声明a,那么a就会出现在内存中的b之前,我会得到您期望的输出。但是,正如您可以从其他答案和注释中看到,由于未定义的行为,行为不可靠。

答案 1 :(得分:1)

  

为什么当我给" bye"输入程序打印" helby"?

在程序中,您尝试在此循环中超出数组a[]的范围进行访问:

 for(i = 0; (c = getchar()) != EOF; i++) 
     a[i] = c; //only defined behaviour for `i = 0`

例如,当您提供bye作为输入时,

a[0] -> overwritten with b
a[1] -> undefined behaviour as you are accessing out of bounds
a[2] -> same as a[1]

在这里,您可以看到b[]数组无处可更改。

导致未定义的行为。所以你的输出可以是任何(从无到有)