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

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]的数组对象xn元素,则表达式P + J和J + P(其中J具有该值j)指向(可能是假设的)元素,x[i+j]如果i + j0≤≤n且表达式P-J指向到(可能-假设的)元件x[i?j],如果0≤ i ? jn.
    • 否则,行为未定义.

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

我对么?

data被宣布为的情况怎么样std::array<std::array<int, 2>, 2>?这种情况似乎更可能是UB,因为结构可能有填充.

Ser*_*eyA 8

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

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