将存储在int中的内存地址分配给int

时间:2018-12-12 14:47:32

标签: c++ c

假设uint32_t x的值是一个地址。我如何获得该地址背后的价值? 我的尝试是简单地将地址分配给指针。

int*y = x;

但是x不是int指针,它只是一个以地址作为值的int。

2 个答案:

答案 0 :(得分:2)

可以使用reinterpret_cast或显式转换将足够大的整数类型表示为所有数据指针。可以使用间接运算符将指针间接获得指针值。

请注意,uint32_t不能保证足够大以能够表示所有指针值(实际上在现代64位cpus上还不够)。 uintptr_t就是为了这个目的。

请注意,如果指向的地址不包含(兼容类型的)对象,则行为将是不确定的。

答案 1 :(得分:2)

在C ++中,可以使用reinterpret_cast

  

8.5.1.10重新解释演员表[expr.reinterpret.cast]
  ...
  5.整数类型或枚举类型的值可以显式转换为指针。指针将转换为足够大的整数(如果实现中存在这样的大小)并返回相同的指针类型,则指针将具有其原始值;指针和整数之间的映射否则由实现定义。 [注:除非有6.6.4.4.3所述,否则这种转换的结果将不是安全得出的指针值。 —尾注]

并且6.6.4.4.3中的规则规定:

  

仅当整数类型的类型至少与std::intptr_t一样大且为以下值之一时,整数值才是安全派生指针的整数表示形式:
  —(3.1)对安全得出的指针值进行reinterpret_cast的结果;
  —(3.2)对安全派生的指针值的整数表示形式进行有效转换的结果;
  —(3.3)从可追溯的指针对象复制了其值的对象的值,其中在复制时,源对象包含安全派生的指针值的整数表示;
  —(3.4)加法运算或按位运算的结果,如果操作数之一是安全派生的指针值P的整数表示,则由reinterpret_cast<void*>转换的结果将等于安全派生的指针可计算来自reinterpret_cast<void*>(P)

因此,如果x(在问题中)的类型至少与std::intptr_t一样大,并且已经按照上述规则已经是安全派生指针的整数表示,则您将能够获取存储在x中的地址后面的值。