假设我有一个有效的指针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/