2017-11-18 90 views
0

的負C數incosistent結果我有兩個陣列和出兩者的我得特定索引的值。在做這件事的時候,我有一些奇怪的東西。當我打印出來的ARR1的指數值爲-1,我得到0,同樣的事情發生與指數8.我的結論是,一個數組的範圍之外inidces都爲0。現在我的問題返回。當我做ARR2同樣的事情,我得到29指數-1的價值。
我在做什麼錯?與陣列

int arr1[] = {33, 12, 75, 85, 62, 14, 100, 29}; 

printf("Nummer -1: %d\n",arr1[-1]); //outputs 0 
printf("Nummer 8: %d\n",arr1[8]; //outputs 0 


int arr2[] = {85, 15, 84, 96, 4, 45, 55, 12, 25, 68}; 
printf("Nummer -1: %d\n",arr2[-1]); //outputs 29 

注:我使用的代碼:Linux Mint的塊和gcc編譯器

+0

只要它指向有效的地址,你可以使用負index..otherwise是UB – coderredoc

+0

@ypercubeᵀᴹ其-1,對不起。 – Ned

回答

4

我得出的結論是一個數組的範圍之外的指數爲0。

這是一個錯誤的結論得出返回:外訪問索引數組的範圍產生未定義的行爲。訪問也可以產生任意值,但它也可能你的程序崩潰:一旦不確定的行爲被調用時,程序處於無效狀態。

當我做arr2同樣的事情,我得到29指數-1的價值。

在這種特殊情況下,您的程序似乎從不同的數組中讀取值(即arr1中的最後一個值)。這仍然是不確定的行爲,雖然如此,這樣做在一個無效的方案成果。

+0

非常感謝您! – Ned

1

負數組索引C和C++違法。它是在調用C. undefined behaviour

從C11§6.5.2.1數組下標

後綴表達式,隨後在方括號[] 一個表達式是一個數組對象的元素的下標指定。 下標操作[]的 定義是E1[E2]是 相同(*((E1)+(E2)))因爲這 適用於二元+運算,如果E1是一個數組對象 (等同於一個指針數組對象的初始元件) 和E2是一個整數的轉換規則的,E1[E2]指定E2個元素的E1 (從零計數)。

Clang編譯器生成的警告

warning: array index -1 is before the beginning of the array [-Warray-bounds] 
printf("Nummer -1: %d\n",arr1[-1]); //outputs 0