为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
斯蒂芬大帝 2019-11-03 17:04:32
我可以将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)元素的次数。从中可以看出,你所要做的事情是完全合法的。


查看完整回答
反对 回复 2019-11-04
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这两行都会导致未定义的行为。

订阅被解释为指针添加,后跟间接,即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-11-04
  • 3 回答
  • 0 关注
  • 433 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信