P.J*_*Boy 9 c++ multidimensional-array
请考虑以下代码:
int data[2][2];
int* p(&data[0][0]);
p[3] = 0;
Run Code Online (Sandbox Code Playgroud)
或等效地:
int data[2][2];
int (&row0)[2] = data[0];
int* p = &row0[0];
p[3] = 0;
Run Code Online (Sandbox Code Playgroud)
我不清楚这是否是未定义的行为.
p是指向row0具有2个元素的数组的第一个元素的指针,因此p[3]访问数组的末尾,根据7.6.6 [expr.add],它是UB:
- 当具有整数类型的表达式J被添加到指针类型的表达式P或从其中减去时,结果具有类型P.
- 如果P求值为空指针值且J求值为0,则结果为空指针值.
- 否则,如果P指向具有元素
x[i]的数组对象x的n元素,则表达式P + J和J + P(其中J具有该值j)指向(可能是假设的)元素,x[i+j]如果i + j0≤≤n且表达式P-J指向到(可能-假设的)元件x[i?j],如果0≤i ? j≤n.- 否则,行为未定义.
我没有在标准中看到任何对多维数组进行特殊处理的东西,所以我只能得出结论,上面实际上是UB.
我对么?
data被宣布为的情况怎么样std::array<std::array<int, 2>, 2>?这种情况似乎更可能是UB,因为结构可能有填充.