2016-12-06 49 views
0

我試圖在c中的for循環播放數組初始化。在C循環(鏗鏘VS海灣合作委員會)的數組值

這裏是我試過的程序:

#include<stdio.h> 
int main(){ 
for(int i=0;i<3;i++){ 
    for(int j=0;j<3;j++){ 
     int br[10]={0}; 
     printf("%d\n", br[-1]); 
    } 
} 

return 0; 
} 

這段代碼的結果時,用gcc編譯如下:

0 1 2 0 1 2 0 1 2 

時鏗鏘編譯同樣的程序,結果是:

0 0 0 0 0 0 0 0 0 

如果我通過在開始第二個lo之前進行數組初始化來調整程序OP:

#include<stdio.h> 


int main(){ 
for(int i=0;i<3;i++){ 
    int ar[10]={0}; 
    for(int j=0;j<3;j++){ 
     int br[10]={0}; 
     printf("%d\n", br[-1]); 
    } 
} 

return 0; 
} 

我得到的輸出0 0 0 0 0 0 0 0 0對GCC和鐺

誰能解釋究竟是什麼在這裏發生的事情,當我嘗試,爲什麼這些結果顯示了這兩個不同的訪問負指數編譯器(gcc和clang)以及爲什麼在第二次循環改變所有內容之前另一個數組初始化。

+3

'BR [-1]'是[未定義行爲(https://en.wikipedia.org/wiki/Undefined_behavior)......這就是 – LPs

+0

我不這麼認爲。我認爲這與內存分配有關。 – satishdd

+1

不,它是UB,純粹而簡單。編譯器保留吃你的貓的權利。 – Bathsheba

回答

3

br[-1]的行爲是undefined

C標準沒有定義試圖將邊界陣列的外部訪問的元素的行爲。 (有趣的是,主要是因爲這個原因,爲什麼C被許多人視爲一種「不安全」的語言)。您可以隨時檢查生成的彙編程序,以便全面分析編譯器生成的內容。

1

Here is an example of using negative array idexes.

如果使用BR [-1]您在陣列之前打印元素:

some stuff | your array | more stuff 
X X X X X | 0 0 0 0 ...| X X X X 
     ^this element will be printed 

因此,在一個情況下,你也許有i或j的值,但在此之前數你的數組可以用不同的編譯器或編譯器選項來改變。

@Bathsheba 在我的鏈接最多的回答說,行爲是C99§6.5.2.1/ 2定義的,但你不知道哪個變量位於您的陣列前方。

下標運算符[]的定義是E1 [E2]等於(*((E1)+(E2)))。

相關問題