当指针不指向字符数组时,指针加法是否未定义?
C 17 标准规定,将整数值添加到指针会导致与操作数类型相同的指针,如果操作保持在数组范围内,则结果指向数组中的(假设的)元素。然而,目前尚不清楚这是否适用于不指向 char 数组的指针。
考虑以下代码:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
标有 (*) 的行是否构成未定义行为 (布)?指针 p 指向浮点数,而不是字符数组。根据引用的段落,这应该导致 UB。然而,如果它是 UB,它将显着限制 offsetof() 的实用性。
普通可复制类型的标准定义指出,可以使用 std::memcpy 等函数将其底层字节复制到 char 数组中。这意味着应该为指向构成对象的原始字节的指针定义加法,无论结果是否用于将字节复制到数组中。
这是否意味着所涉及的字节已经形成数组或构成对运营商通常规则的特殊例外尚不清楚。然而,任何一种解释都会使代码中的添加有效。因此,可以得出结论,添加到 char * 指针并不一定会导致 UB,即使它不指向 char 数组。
以上是C 17中不指向字符数组时指针加法是否未定义?的详细内容。更多信息请关注PHP中文网其他相关文章!