2016-06-10 44 views
0
#include <stdio.h> 
main() { 
    int a[1]; 
    a[0] = 1; 
    a[1] = 2; 
    a[2] = 6; 
    printf("%d\n", a[2]); 
} 

雖然a是大小爲1的數組,但它爲什麼接受a[2] = 6這段代碼是如何編譯成功的?

+1

'a [2]'僅僅是一個參考'2 * sizeof(int)'遠離'a [0]'的地址....你只是訪問出界 – Cherubim

+5

'c'確實不提供數組邊界檢查。 –

回答

3

儘管a是大小爲1的數組,然後是否接受[2] = 6?

認爲接受因爲它調用undefined behavior

數組是基於0的C索引,而對於大小爲1的數組,只有arr[0]是有效訪問,甚至不是arr[1]。在這種情況下嘗試訪問除0以外的任何其他索引將導致調用UB的出界訪問。

默認情況下,C規範不會爲數組索引提供任何綁定檢查,所以您在默認情況下不會得到錯誤。但是,如果啓用編譯器警告,至少應該能夠獲得提示。 FWIW,-Warray-bounds=1-O2應該警告你。

也就是說,對於一般的託管環境,main()的簽名是int main(void),以防您不想使用該程序的任何命令行參數。