我在許多例子中看到它被寫:爲什麼當N越界時,&n [N]不會調用UB?
#define N 5
....
int a[N], *p;
....
for (p = &a[0]; p < &a[N]; p++);
顯然,a[N]
不存在,那麼爲什麼編譯器不給任何警告(如越界),或者錯誤或它調用UB ?
我在許多例子中看到它被寫:爲什麼當N越界時,&n [N]不會調用UB?
#define N 5
....
int a[N], *p;
....
for (p = &a[0]; p < &a[N]; p++);
顯然,a[N]
不存在,那麼爲什麼編譯器不給任何警告(如越界),或者錯誤或它調用UB ?
內存在&a[N]
永遠不會被您的程序訪問,所以沒關係。 C標準允許比較一個數組對象內或之後的指針。
編輯關於下面的討論:
&a[N]
不不導致未定義的行爲 - 這是完全等同於a + N
。從C標準,6.5.3.2地址和間接運營商,第3款:
一元
&
操作產生其操作數的地址......如果操作數是[]
操作的結果,既不&
操作者也沒有一元*
由所述[]
暗示被評估,其結果是因爲如果&
運營商被刪除,運營商的[]
運營商被更改爲+
運營商。
c編譯器通常不會給出界限警告。你在用什麼編譯器? –
@ DanielA.White; GCC-4.7.1 – haccks
C編譯器不檢查邊界 - 他們相信你知道他們沒有的東西:) – dasblinkenlight