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



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

int*y = x;

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

可以使用reinterpret_cast或显式转换将大到足以表示所有数据指针的整数类型转换为指针。可以使用间接运算符对指针进行间接操作,以获得指向的值。

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

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

在C++中,这可以使用reinterpret_cast来完成

8.5.1.10重新解释cast[expr.relpreter.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中的地址后面的值。

相关内容

最新更新