gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:37:57 25 4
gpt4 key购买 nike

考虑以下代码:

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是指向数组第一个元素的指针 row0有 2 个元素,因此 p[3]访问超过数组的末尾,根据 7.6.6 [expr.add] 是 UB:

  • When an expression J that has integral type is added to or subtracted from an expression P of pointer type, the result has the type of P.
    • If P evaluates to a null pointer value and J evaluates to 0, the result is a null pointer value.
    • Otherwise, if P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i+j] if 0 ≤ i + jn and the expression P - J points to the (possibly-hypothetical) element x[i−j] if 0 ≤ i − jn.
    • Otherwise, the behavior is undefined.

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

我说的对吗?

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

最佳答案

是的,你是对的,没什么可补充的。 C++ 类型系统中没有多维数组,只有数组(任意数组的数组的数组)。

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

关于c++ - 是否通过指向第一个元素 UB 的指针访问多维数组的中间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53526184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com