![](/img/trans.png)
[英]Is accessing static class member via unitilialized pointer 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 + j
≤n
和公式P - J点(可能-假设的)元件x[i−j]
如果0≤i − j
≤n
。- 否则,行为未定义。
我没有在标准中看到任何对多维数组进行特殊处理的内容,所以我只能得出结论,上面实际上是UB。
我对么?
如果data
被声明为std::array<std::array<int, 2>, 2>
? 这种情况似乎更可能是UB,因为结构可能有填充。
是的,你是对的,并没有太多可添加的内容。 在C ++类型系统中没有多维数组,只有数组(数组数组的数组随意)。
访问超出数组大小的元素是未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.