【问题标题】:C++ - Get value of a particular memory addressC++ - 获取特定内存地址的值
【发布时间】:2012-08-31 03:54:29
【问题描述】:

我想知道是否可以这样做:

unsigned int address = 0x0001FBDC; // Random address :P
int value = *address; // Dereference of address

意思是,是否可以获取内存中特定地址的值?

谢谢

【问题讨论】:

  • 你还没试过吗?
  • 如果能拿到地址,你想做什么?提示:不要这样做。
  • @Als - 有时是不可避免的,尤其是。在嵌入式或驱动程序中。
  • @MartinJames:我会说如果有人需要问这个问题,那么小费仍然是不要这样做

标签: c++ pointers memory dereference memory-address


【解决方案1】:

你可以而且应该这样写:

#include <cstdint>

uintptr_t p = 0x0001FBDC;
int value = *reinterpret_cast<int *>(p);

请注意,除非有某种保证 p 指向一个整数,否则这是未定义的行为。如果您尝试访问它不希望您访问的地址,标准操作系统将终止您的进程。但是,这可能是独立程序中的常见模式。

(C++ 的早期版本应该是#include &lt;stdint.h&gt;intptr_t。)

【讨论】:

  • 在这种情况下,OP 使用的 c 样式转换和 reinterpret_cast 之间有什么区别吗?我认为在这种情况下后者只是衰减为前者?
  • +1 用于修复类型不匹配,但是是的,它当然会起作用,(需要注意可寻址性、内存管理保护等),否则指针将无法使用!
  • @Als:相反,C 风格的演员阵容衰减为reinterpret_cast。 C++ 中 C 样式转换的含义是根据 C++ 样式转换 IIRC 定义的。就编译器而言,C++ 中的 C 风格转换通常只是一种说法,“嗯,我不确定我想要什么转换,我会接受厨师的选择”。我之所以这么说,是因为我认为你可以用 C 风格的转换而不是 C++ 风格的转换来做一些可疑的事情:将边界到派生转换为指向私有基址的指针或其他东西。
  • @SteveJessop:True.Eitherway,关键是在这种情况下两者都是相同的,或者我错过了什么,这使得 reinterpret_cast 更好。
  • @Als:我不相信你错过了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2022-08-17
  • 1970-01-01
相关资源
最近更新 更多