我可以将2D数组视为连续的1D数组吗?请考虑以下代码:int a[25][80];a[0][1234] = 56;int* p = &a[0][0];p[1234] = 56;第二行是否调用未定义的行为?第四行怎么样?
3 回答
慕妹3146593
TA贡献1820条经验 获得超9个赞
是的,你可以(不,它不是UB),它是由标准间接保证的。方法如下:2D数组是一个数组数组。保证数组具有连续的内存,并且sizeof(array)
是sizeof(elem)
元素的次数。从中可以看出,你所要做的事情是完全合法的。
30秒到达战场
TA贡献1828条经验 获得超6个赞
这两行都会导致未定义的行为。
订阅被解释为指针添加,后跟间接,即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 关注
- 433 浏览
添加回答
举报
0/150
提交
取消