2016-10-10 62 views
-2

我寫了下面的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]); 

} 

爲什麼當我送你「拜拜」,在輸入程序打印「helby」? 我認爲'b'應該保存在b [0]中的[0],'y'和b [1]中的'e'中。 謝謝您的建議!

+3

那'while'循環有'for'循環的語法並且不能編譯。請發佈顯示問題的[Minimal,Complete和Verifiable示例](http://stackoverflow.com/help/mcve)。 –

+0

謝謝,我編輯它 – sworwitz

+0

您的結果不會重現:(...檢查:https://ideone.com/oAWAiw,在這裏我們得到'hello'作爲輸出時輸入'bye' – Cherubim

回答

1

您認爲a立即跟在內存b。情況並非一定如此。

讀/寫過去的數組的末尾是undefined behavior,所以編譯器可以自由地安排他們選擇的任何順序局部變量。

在我的特定的機器,如果ba之前聲明,然後a出現之前b在內存中,我得到你所期望的輸出。但是,從其他答案和評論中可以看出,由於未定義的行爲,行爲不可靠。

1

爲什麼當我送你「拜拜」,在輸入程序打印「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[]數組沒有任何更改。

它導致未定義行爲。所以你的輸出可以是任何東西(從無到有)

+0

@IlmariKaronen我刪除了第一部分。希望現在清楚:) – Cherubim