2011-11-15 60 views
3

目前已在論壇上用C負陣列上的其他問題/答案,但我會要求回答這些對於32位編譯器: 如果我們有一個數組定義int test_array[5] = {1,2,3,4,5};負數組索引

那應該下列語句返回 test_array[20]test_array[-2]test_array[-32764]test_array[4294967700](值比32位可以容納更大),*(a-32764)

該編譯器力的情況下,指數要返回任何固定值超出其宣稱的範圍?

回答

5

訪問數組超出範圍導致未定義行爲(UB)
-ve索引不是有效的索引並導致未定義的行爲。

一個未定義的Bheavior意味着任何事情都可以直接發生,如果幸運的話,你的程序將崩潰並且檢測到問題,如果你不走運,代碼一直工作得很好,並且有一天所有地獄都會崩潰。
因此,請務必避免編寫任何導致未定義的行爲的代碼。

在索引超出其聲明範圍的情況下,編譯器是否強制返回任何固定值?

NO
程序員必須照顧這。該標準不需要編譯器給你提供任何指示/警告。標準只是將其定義爲UB

另外的標準識別所有下列情況導致未定義行爲:一個指針的

  • 加法或減法成,或者剛好超出,陣列對象和一個整數型產生的結果的確不要指向或超出相同的數組對象。
  • 將指針加入或減去一個指向數組對象或整數類型的指針會產生一個結果,該結果僅指向數組對象之外,並用作被評估的unary * operator的操作數。
  • 數組下標超出範圍,即使某個對象明顯可以使用給定的下標進行訪問(如給出聲明int a[4][5]的左值表達式a[1][7])。
14

因爲您正在訪問數組越界,所以它是不確定的行爲。

然而,負指數並不一定意味着未定義的行爲。下面的代碼被很好地定義:

int test_array[5] = {1,2,3,4,5}; 
int *p = test_array + 1; 
int i = p[-1];//i now has the value 1 

這等效於:外部的陣列是Undefined Behaviour

int i = *(p-1); 
1

訪問的元素。

此外,使指針指向數組之外的元素(除了(不存在的)one-past-the-last外)也是Undefined Behavior。訪問過去的最後一個是未定義的行爲(指針存在可以)

int arr[42] = {0}; 
int *ptr = arr; 
ptr += 41; /* ok, ptr points to the last element of arr */ 
*ptr;  /* ok */ 
ptr += 1; /* ok, ptr points to one-past-the-last */ 
*ptr;  /* UB */ 
ptr += 1; /* UB */ 

ptr = arr; 
ptr -= 1; /* UB */