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
?這段代碼是如何編譯成功的?
#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
?這段代碼是如何編譯成功的?
儘管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)
,以防您不想使用該程序的任何命令行參數。
'a [2]'僅僅是一個參考'2 * sizeof(int)'遠離'a [0]'的地址....你只是訪問出界 – Cherubim
'c'確實不提供數組邊界檢查。 –