我可以将2D数组视为连续的1D数组吗?

我可以将2D数组视为连续的1D数组吗?

请考虑以下代码:

int a[25][80];a[0][1234] = 56;int* p = &a[0][0];p[1234] = 56;

第二行是否调用未定义的行为?第四行怎么样?


斯蒂芬大帝
浏览 434回答 3
3回答

慕妹3146593

是的,你可以(不,它不是UB),它是由标准间接保证的。方法如下:2D数组是一个数组数组。保证数组具有连续的内存,并且sizeof(array)是sizeof(elem)元素的次数。从中可以看出,你所要做的事情是完全合法的。

30秒到达战场

这两行都会导致未定义的行为。订阅被解释为指针添加,后跟间接,即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);}编译器在常量表达式中出现时检测到此类未定义的行为。
打开App,查看更多内容
随时随地看视频慕课网APP