2014-01-21 67 views
1

如果我有一个存储位置的地址存储在一个变量中,即uint64_t为64位系统上的8字节指针,我可以使用存储在uint64_t中的值来创建一个新指针指向它拥有的内存位置?指向存储在uint64_t中的内存位置的指针

struct Node { .. }; 
Node* node = new Node(5); 
uint64_t addr = (uint64_t)static_cast<void*>(&node); // 8 byte pointer 

例如节点的地址是0x7fff76bb4880addr存储140735185373312(的dec表示),我想新的指针Node* new_ptr = (Node*)0x7fff76bb4880

我意识到这将是平台特定的。

回答

7

该标准保证指针可以转换为“足够大”的整数类型,然后再返回,得到相同的指针值。具体而言,C++ 11 5.2.10重释施放[expr.reinterpret.cast]/4:

的指针可以被显式转换为任何整数类型足够大以容纳它。映射函数是实现定义的。

和5:

积分型或枚举类型的值可以显式转换为指针。转换为具有足够大小的整数的指针(如果存在于实现上的话)并返回到相同的指针类型将具有其原始值;指针和整数之间的映射在其他方面是实现定义的。如果支持的话 - -

类型从<cstdint>intptr_tuintptr_t保证是足够大以存储任何对象指针类型。通常他们被使用 - 即使你知道uint64_t是你平台上的指针的大小 - 因为他们明确表示你打算在指针和整数之间进行转换。

我将作为练习让读者证明C演员阵容相当于执行reinterpret_cast

TLDR:标准保证这一计划将永远不会失败的断言:

auto pointer_as_int = reinterpret_cast<uintptr_t>(&foo); 
auto int_as_pointer = reinterpret_cast<decltype(&foo)>(pointer_as_int); 
assert(&foo == int_as_pointer); 
+0

完美。谢谢。 – user3217789