亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問可以將2D數組視為連續的1D數組嗎?

請問可以將2D數組視為連續的1D數組嗎?

C++
烙印99 2019-12-02 04:04:01
我可以將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)元素的次數。從中可以看出,你所要做的事情是完全合法的。


查看完整回答
反對 回復 2019-12-03
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

這兩行都會導致未定義的行為。

訂閱被解釋為指針添加,后跟間接,即a[0][1234]p[1234]等同于*(a[0] + 1234)*(p + 1234)。根據[expr.add] / 4

如果表達式P指向具有n個元素的數組對象x的元素x [i],則表達式P + JJ + 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);}

編譯器在常量表達式中出現時檢測到此類未定義的行為。




查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 501 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號