【问题标题】:Pointer to memory location stored in uint64_t指向存储在 uint64_t 中的内存位置的指针
【发布时间】:2014-01-21 05:37:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    该标准保证指针可以转换为“足够大”的整数类型,然后再次转换为相同的指针值。具体来说,C++11 5.2.10 Reinterpret cast [expr.reinterpret.cast]/4:

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

    和5:

    整数类型或枚举类型的值可以显式转换为指针。转换为足够大小的整数(如果实现中存在这样的整数)并返回相同指针类型的指针将具有其原始值;指针和整数之间的映射是由实现定义的。

    &lt;cstdint&gt; 中的 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多