首页 > 后端开发 > C++ > 正文

当'char *”指针不指向数组时,添加到该指针是否是未定义的行为?

Linda Hamilton
发布: 2024-11-10 14:41:02
原创
471 人浏览过

Is Adding to a

添加到“char *”指针:UB 或 Not?

C 17 定义了向指针添加整数表达式的规则,指出当结果超出指向数组的边界时,会产生未定义的行为。但是,该定义专门适用于指向数组元素的指针。

考虑以下代码片段:

struct Foo {
    float x, y, z;
};

Foo f;
char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float *>(p) = 42.0f;
登录后复制

问题是行 (*) 是否会触发未定义的行为。尽管将 float 的地址重新解释为 char 指针,但它并不指向 char 数组。因此,根据引用的定义,这似乎是未定义的行为。然而,如果是这种情况,offsetof 宏的实用性将受到严重损害。

但是,C 还允许将任何普通可复制类型的底层字节复制到字符数组中。此操作可以使用 std::memcpy 等函数或手动逐字节执行,不需要原始对象是数组。

因此,为了让这些逐字节操作成功,必须为指向对象原始字节的指针定义向指针添加整数表达式。这些字节是否隐式形成数组或构成一般加法规则的特殊例外尚不清楚。尽管如此,任何一种解释都可以证明所提供的代码示例中添加内容的有效性。因此,在此上下文中添加“char *”指针不会导致未定义的行为。

以上是当'char *”指针不指向数组时,添加到该指针是否是未定义的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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