2011-12-08 58 views
4

this參考,在C似乎下列行爲是不確定的。我可以使用指針訪問多維數組嗎?

int my_array[100][50]; 
int *p = my_array[0]; 
p[50]; // UB 

在C++ 03或C++ 11中有參考證實嗎?

+0

爲什麼你認爲'P [50]'包括未定義行爲? –

+0

有趣的是,我可以用'gcc -Wall -Wextra'編譯你的例子,並且不會收到任何未定義行爲的警告;將'p [50]'改爲'p [50] = 1;'清除「無效」警告,並確保它知道它應該生成代碼。 (如果你想確保它不會優化線路,請添加一些'printf(3)'調用。) – sarnold

+0

@Let_Me_Be:讀取鏈接。似乎是問兩個不同的事情,需要澄清他是否想知道二維數組指針(按照鏈接)或靜態數組(根據他的代碼)。 – tinman

回答

6

是在+運營商的說明。你不能取消引用C中的指針,因爲它已經超過了第一個子數組的結束指針。在C++中,這當前是合法的,因爲指針指向爲一個有效的整數(指向關係的點在第3節的某處定義)。但是,在兩個標準中,添加超過50個都會產生未定義的行爲

一個DR最近發送到C++委員會有關規則解引用這種「有效憑空」指針可以間接引用,所以我不會依靠這一點。

+0

該死的上下文中的概念「實體」的,我沒有C89標準在這裏,而是指向多維數組的情況下array_一個_Pointer C99會談,我會親自解釋這作爲定義行爲,因爲指針並不指向原始數組之外,只在子數組之外。 –

+0

要澄清,當您說「是」時,您的意思是「是的行爲是未定義的」; (問題標題是實際文章中問題的否定!)。並且說你不能添加超過50的標準部分是'[expr.add]#5'。 –

-1
int my_array[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
for(i=0;i<3*3;i++) 
{ 
    printf("%d,",*(*my_array+i)); 
} 

輸出 1,2,3,4,5,6,7,8,9,

我認爲你可以那樣做。