【发布时间】:2019-04-30 18:12:26
【问题描述】:
考虑以下代码:
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≤ @ 987654336@.- 否则,行为未定义。
我在标准中没有看到任何对多维数组进行特殊处理的东西,所以我只能得出结论,以上实际上是UB。
我说的对吗?
data 被声明为std::array<std::array<int, 2>, 2> 的情况如何?这种情况似乎更有可能是 UB,因为结构可能有填充。
【问题讨论】:
标签: c++ multidimensional-array