2010-02-09 48 views
3

我有以下的作業問題:尋址的一維指針數組與兩個維度

Consider the following declarations and answer the question. 
char strarr1[10][32]; 
char *strarr2[10]; 

Are strarr1[3][4] and strarr2[3][4] both legal references? 

我試圖用gcc編譯的代碼進行測試。我很確定第二個參考文獻會引發錯誤,但它沒有。這是我編譯與海灣合作委員會:

int main(void){ 
    char strarr1[10][32]; 
    char *strarr2[10]; 

    char x = strarr1[3][4]; 
    char y = strarr2[3][4]; 

    return 0; 
} 

我正在假設我使用的測試代碼是正確的。

當strarr2是一維數組時,怎麼可能引用strarr2 [3] [4]?

回答

1

因爲strarr2是char *的陣列,所述第二[4]是一個指數到字符*

這意味着同樣的事情,因爲這

char * temp = strarr2[3]; 
char y = temp[4]; 

因爲我不不會在代碼中的任何地方看到strarr2正在被初始化,也沒有看到strarr2 [3]被分配到的任何地方,這個代碼將不會像所顯示的那樣工作。它會返回垃圾或段錯誤。

0

它是指針的單維陣列。所以,你被索引爲3的指針與偏移量= 4:

char y = *(strarr2[3] + 4); 

相同:

char y = strarr2[3][4]; 
1

由於指針算術索引約定,它們都是合法的語法。然而,在你的代碼:

char y = strarr2[3][4]; // <--- NOT SAFE! 

正在訪問未分配的內存,併產生不確定的行爲,ERGO是

所以放棄它。