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