2014-01-15 38 views
5

我寫下面的代碼在C:Ç怪異有趣的節目輸出

#include <stdio.h> 
#include <stdlib.h> 

#define LEN 100 

int main(void) 
{ 
    int arr[LEN]; 
    int i; 

    for (i = 0; i < LEN; i++) 
     printf("%d ", arr[LEN]); 

    getchar(); 
    return 0; 
} 

首先,請注意,我故意存取存儲器,其不是陣列的一部分(最後單元將在指數LEN-1,我訪問arr[LEN],不arr[i]

怪異的結果是,當我運行程序時,它打印所有0的號碼...... LEN-1。 對於〔實施例,當LEN定義像這裏100,輸出是:

0 1 2 ..... 99

請運行該程序。它也發生在你身上嗎?我認爲這是平臺依賴的行爲。 (如果相關,我在Windows 7上運行此代碼。)

爲什麼arr [LEN]的值會改變?

+13

未定義的行爲是未定義的行爲。在這種特殊情況下,它看起來好像禁用了優化,而'i'正好位於'arr'結尾後的下一個地址,但通常情況下*會發生任何事情(惡魔,鼻子等),它不會不會感到驚訝。 –

+0

第一個初始化數組,第二個'arr [LEN]'是未定義的行爲,它應該是'arr [i]' –

+0

@PaulR哦,現在我明白了。謝謝,這顯然是答案。 – Programmer

回答

3

爲了擴大在別人的答案,考慮以下因素:

代碼

#include <stdio.h> 
#include <stdlib.h> 

#define LEN 100 

int main(void) 
{ 
    int i; 
    int arr[LEN]; 

    printf("&arr[LEN]: %p\n", &arr[LEN]); 
    printf("&i:  %p\n", &i); 

    return 0; 
} 

輸出

 
&arr[LEN]: 0x7fff5cf90a74 
&i:  0x7fff5cf90a74 

在我的機器,如果iarr之前聲明,iarr[LEN]具有相同的地址。

運行您計算機上的以下

#include <stdio.h> 
#include <stdlib.h> 

#define LEN 100 

int main(void) 
{ 
    int arr[LEN]; 
    int i; 

    printf("&arr[LEN]: %p\n", &arr[LEN]); 
    printf("&i:  %p\n", &i); 

    return 0; 
} 

你應該看到非常類似(地址不同,當然),以我所看到的東西。

+0

謝謝,這顯然是答案。 – Programmer

+0

回覆:「你應該看到一些非常相似的東西」 - 注意你需要編譯時禁用所有的優化,以便有機會看到類似的結果,即使這樣也不能保證。 –

+0

@PaulR他已經配置好了,看到類似的東西,因此,這個問題。 –

6

堆棧是保留局部變量的地方。您的編譯器正在使用數組(基本上arr[LEN])之後的內存位置來保留i。因此,您在每次迭代中意外打印出i。不同的編譯器可能會在其他地方保留i,並且您不會看到相同的內容。