1

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

即我可以确定没有UBp1 == &a[1]吗?

4

1 回答 1

2

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

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

于 2015-05-21T09:56:05.003 回答