首页 > 后端开发 > C++ > 非数组指针上的指针算术是否具有'reinterpret_cast”未定义行为?

非数组指针上的指针算术是否具有'reinterpret_cast”未定义行为?

Patricia Arquette
发布: 2024-11-08 15:12:01
原创
1101 人浏览过

Is Pointer Arithmetic on Non-Array Pointers with `reinterpret_cast` Undefined Behavior?

非数组指针的指针算术是否未定义行为?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板