繁体   English   中英

是通过指向其第一个元素UB的指针访问多维数组的中间?

[英]Is accessing the middle of a multidimensional array via a pointer to its first element UB?

请考虑以下代码:

int data[2][2];
int* p(&data[0][0]);
p[3] = 0;

或等效地:

int data[2][2];
int (&row0)[2] = data[0];
int* p = &row0[0];
p[3] = 0;

我不清楚这是否是未定义的行为。 p是指向具有2个元素的数组row0的第一个元素的指针,因此p[3]访问超过数组的末尾,根据7.6.6 [expr.add]是UB:

  • 当具有整数类型的表达式J被添加到指针类型的表达式P或从其中减去时,结果具有类型P.
    • 如果P求值为空指针值且J求值为0,则结果为空指针值。
    • 否则, 如果P指向具有n元素的数组对象x元素x[i] ,则表达式P + J和J + P(其中J具有值j )指向(可能是假设的)元素x[i+j]如果0≤ i + jn和公式P - J点(可能-假设的)元件x[i−j]如果0≤ i − jn
    • 否则,行为未定义。

我没有在标准中看到任何对多维数组进行特殊处理的内容,所以我只能得出结论,上面实际上是UB。

我对么?

如果data被声明为std::array<std::array<int, 2>, 2> 这种情况似乎更可能是UB,因为结构可能有填充。

是的,你是对的,并没有太多可添加的内容。 在C ++类型系统中没有多维数组,只有数组(数组数组的数组随意)。

访问超出数组大小的元素是未定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM