2013-08-02 22 views
1

我在許多例子中看到它被寫:爲什麼當N越界時,&n [N]不會調用UB?

#define N 5 
.... 

int a[N], *p; 
.... 

for (p = &a[0]; p < &a[N]; p++); 

顯然,a[N]不存在,那麼爲什麼編譯器不給任何警告(如越界),或者錯誤或它調用UB ?

+0

c編譯器通常不會給出界限警告。你在用什麼編譯器? –

+0

@ DanielA.White; GCC-4.7.1 – haccks

+4

C編譯器不檢查邊界 - 他們相信你知道他們沒有的東西:) – dasblinkenlight

回答

7

內存在&a[N]永遠不會被您的程序訪問,所以沒關係。 C標準允許比較一個數組對象內或之後的指針。

編輯關於下面的討論:

&a[N]導致未定義的行爲 - 這是完全等同於a + N。從C標準,6.5.3.2地址和間接運營商,第3款:

一元&操作產生其操作數的地址......如果操作數是[]操作的結果,既不&操作者也沒有一元*由所述[]暗示被評估,其結果是因爲如果&運營商被刪除,運營商的[]運營商被更改爲+運營商。

+0

雖然不是技術上可以訪問嗎? '&a [N]'是'&(*(a + n))'的縮寫,所以'a + n'被解除引用,然後再次被引用。所以我很確定這確實會調用UB。 – sepp2k

+1

我想''(*(a + n))'只是優化到'(a + n)' - 只要你沒有實際取消引用它,我不明白爲什麼它應該是UB。 –

+0

@DrewMcGowen這是一個實現細節。它應該是UB,因爲取消引用超出數組邊界的指針('a + N'確實會調用UB)。 – sepp2k

相關問題