非数组指针的指针算术是否未定义行为?
C 标准指定对指针进行加或减整数表达式的结果在相同类型的指针中。但是,如果指针最初指向数组中的元素,则生成的指针也必须指向数组中的有效元素。这就提出了一个问题:添加到实际上并不指向字符数组的“char *”指针是否是未定义行为(UB)?
考虑以下代码:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
Line () 执行reinterpret_cast 将f 的地址转换为“char ”指针,然后添加z 成员的偏移量。得到的指针 p 用于修改 f.z.
根据标准,这一行的结果应该是 UB,因为 p 不指向字符数组。然而,通常假设允许使用此类指针来操作对象的底层内存表示。
该标准没有明确声明这是 UB,但它要求普通可复制类型的对象可以被复制到 char 或 unsigned char 数组中。这表明应该为指向构成对象的原始字节的指针定义指针算术,以允许上述操作。
因此,可以合理地得出这样的结论:添加到“char *”指针不会在底层字节打算复制到数组中的情况下,指向字符数组的 t 不是 UB。
以上是非数组指针上的指针算术是否具有'reinterpret_cast”未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!