我可以將2D數組視為連續的1D數組嗎?請考慮以下代碼:int a[25][80];a[0][1234] = 56;int* p = &a[0][0];p[1234] = 56;第二行是否調用未定義的行為?第四行怎么樣?
3 回答

慕慕森
TA貢獻1856條經驗 獲得超17個贊
是的,你可以(不,它不是UB),它是由標準間接保證的。方法如下:2D數組是一個數組數組。保證數組具有連續的內存,并且sizeof(array)
是sizeof(elem)
元素的次數。從中可以看出,你所要做的事情是完全合法的。

largeQ
TA貢獻2039條經驗 獲得超8個贊
這兩行都會導致未定義的行為。
訂閱被解釋為指針添加,后跟間接,即a[0][1234]
/ p[1234]
等同于*(a[0] + 1234)
/ *(p + 1234)
。根據[expr.add] / 4:
如果表達式
P
指向具有n個元素的數組對象x的元素x [i],則表達式P + J
和J + P
(其中J
具有值j)指向(可能是假設的)元素x [i + j],如果0≤i+ j ≤N; 否則,行為未定義。
因為a[0]
(衰減到指針a[0][0]
)/ p
指向a[0]
(作為數組)的元素,并且a[0]
只有大小80,行為是未定義的。
正如語言律師在評論中指出的那樣,以下程序無法編譯。
constexpr int f(const int (&a)[2][3]){ auto p = &a[0][0]; return p[3];}int main(){ constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, }; constexpr int i = f(a);}
編譯器在常量表達式中出現時檢測到此類未定義的行為。
- 3 回答
- 0 關注
- 501 瀏覽
添加回答
舉報
0/150
提交
取消