如果我有一个存储在变量中的内存位置的地址,即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
例如,节点的地址为0x7fff76bb4880
,addr
存储140735185373312
(dec表示),我想要一个新的指针Node* new_ptr = (Node*)0x7fff76bb4880
。
我意识到这将是特定于平台的。
答案 0 :(得分:9)
该标准保证指针可以转换为“足够大”的整数类型并再次返回,从而产生相同的指针值。具体来说,C ++ 11 5.2.10重新解释cast [expr.reinterpret.cast] / 4:
指针可以显式转换为足以容纳它的任何整数类型。映射函数是实现定义的。
和5:
可以将整数类型或枚举类型的值显式转换为指针。转换为足够大小的整数(如果实现上存在任何此类)并返回相同指针类型的指针将具有其原始值;指针和整数之间的映射是以实现方式定义的。
来自intptr_t
的{{1}}和uintptr_t
类型 - 如果支持 - 保证足够大以存储任何对象指针类型。通常使用它们 - 即使您知道<cstdint>
是平台上指针的大小 - 因为它们清楚地表明您打算在指针和整数之间进行转换。
我会留下作为练习让读者证明C演员阵容相当于表演uint64_t
。
TLDR:该标准保证该程序永远不会使断言失败:
reinterpret_cast