c++ - 将指针强制转换为整数、递增该整数,然后强制转换回来是否安全?

标签 c++ undefined-behavior reinterpret-cast pointer-conversion

假设我有一个有效的指针p0:

T a[10];
T* p0 = &a[0];

我知道我可以像这样安全地往返转换它:

reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0)) == p0;

但是执行以下操作安全吗?

T* p1 = reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0) + sizeof(T));

即我可以确定不存在 UB 并且 p1 == &a[1] 吗?

最佳答案

这是实现定义的行为。您的编译器应记录指针算术是否等效于指针转换后的数值的整数算术。在具有“平面”字节寻址内存空间的现代计算机上应该是这种情况;但不保证它可以在所有平台上移植。

使用 char* 而不是 uintptr_t 可以移植,只要您留在数组中并确保指针与 T 正确对齐> 在转换回来之前。

关于c++ - 将指针强制转换为整数、递增该整数,然后强制转换回来是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30370081/

相关文章:

c++ - 即使输入正确的内容,程序始终会引发异常

c++ - 为什么 'undefined behaviour'存在?

c++ - 为什么表达式 (int) +1e10 不会产生 -2147483648 正如 CSAPP 所描述的那样?

c++ - 通过 void* 和 reinterpret_cast 从字节字段读取

c++ - reinterpret_cast 指向 void(*&)() 的成员函数指针

c++ - 空白 "cout"是做什么的?

c++ - 调整大小时,std::vector是否会复制/move 元素?

c++ - 将 std::vector<unsigned int> 解释为 bitvector - 高效算法?

c++ - 当派生类的析构函数是虚拟的而基类的 dtor 不是时代码崩溃

c++ - 在创建结构时修改类私有(private)成员 (C++)