2015-09-09 138 views
-2

在下面的代碼的,我已經分配的值到一個數組元件,其出數組界限,在Linux的環境CLI代碼給我錯誤消息:array index 5 is past the end of the array which contains 5 elements陣列:出索引/邊界

但在IDE上調試時 codeblocks -compiler找不到這個bug-那麼有什麼解釋嗎?

#include <stdio.h> 
int main() 
{ 
    int array[5],i; 
    for (i=0; i<5; i++) { 
     array[i] = i+1; 
    } 
    array[5] = 666; 

    for (i=0; i<5; i++) { 
     printf("array[%d]=%d\n", i, array[i]); 
    } 
    printf("array[5]=%d\n", array[5]); 
    return 0; 
} 
+6

在數組邊界之外使用指示符是[未定義的行爲](https://www.google.pl/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=c%20undefined%20behavior )。除了任何IDE都不能做任何事情。 – Crozin

+0

codeblocs的編譯器是什麼? – LPs

+0

想想** undefined ** _behaviour_的含義。 – Olaf

回答

0

與大多數IDE一樣,代碼塊不包含編譯器,不會自己產生這樣的警告。相反,它會調用像gcc這樣的命令行編譯器,並向您顯示編譯器返回的錯誤和警告。

您應該在Codeblocks /項目設置中檢查使用哪些編譯器選項調用哪個編譯器。

GCC應該產生一個「數組下標是以上數組界限」警告爲您的代碼,而是僅與-Wall-O2和選項(或等同物)。

優化(-O2)通常未啓用調試功能,這可能會解釋爲什麼在調試時沒有得到警告

0

當您訪問數組索引時,C和C++不會執行綁定檢查。您閱讀時得到的數值就是堆棧在這個特定位置存在的結果。他們完全沒有定義。

兩個編譯器之間的差異可能是由於其中一個是包含某些數組綁定檢查的更新版本。