【问题标题】:How to access something at a known memory address? [duplicate]如何访问已知内存地址的内容? [复制]
【发布时间】:2013-03-18 16:45:17
【问题描述】:

我知道使用& 运算符可以找到变量或函数的内存地址。但是如果我知道某个东西在内存位置2,我该如何访问它呢?

例如,如果我声明一个指向2 的指针,它将被读取为值2,而不是内存地址2

【问题讨论】:

  • int* x = (int*)2; ??
  • 关于编辑:您可以通过单击问题下方的“已编辑 X 前”链接访问修订历史记录。如果您认为合适,您可以在那里回滚到另一个版本。但是请注意,在您的问题前加上对其所谓愚蠢的评论并不是很有用。
  • @昆汀。该评论是关于在未经我同意或不需要这样做的情况下更改我的问题的愚蠢行为。
  • @stian 不,不,我的意思是“这是一个愚蠢的问题,但是......”部分。这对任何人都没有帮助。您的审阅者看到这个的可能性很小(没有通知),所以我正在回滚。
  • @stian 您的问题已被编辑,因此它更短但仍然清晰,删除了冗长的部分,并且更改被 3 人接受。 Better questions induces better answers;这个网站不像论坛。

标签: c memory


【解决方案1】:

你只需要把它转换成一个指针:

int *pointerToTwo = (int *)2;

然后你可以像往常一样取消引用:

int valueAtTwo = *pointerAtTwo;

您做这种事情的通常原因是访问内存映射寄存器,在这种情况下,建议使用 volatile 关键字:

int valueAtTwo = *(volatile int *)2;

或者也许将所有的转换都粘贴到一个宏中以使您的代码更易于阅读:

#define intValueAt(x)  (*(volatile int)(x))
int valueAtTwo = intValueAt(2);

旁白:2 几乎肯定不是这个用例的有效地址。我只是因为您在问题中的引用才使用它。

【讨论】:

  • 请注意,这样做需要额外了解指针/内存地址的格式。在某些情况下,从 0 开始寻址并从那里继续向上的内存并不是一个简单的情况。此外,您可以尝试访问受保护免于读取或写入访问的内存。您可以尝试写入ROM。您可以弄乱内存映射的 IO 设备。话虽如此,负责任地使用它会非常有用。
【解决方案2】:
void* pMemory = (void*)2L;

这将创建一个void*(空指针)并将其地址设置为2

请注意,如果您的进程不应访问该内存(您无权读取该内存),则可能会导致各种错误。另请注意,您不应该随机读取地址。使用指针直接访问内存位置容易出错。这就是为什么软件开发人员开发了如此多的技术来帮助我们仅在正确的情况下使用正确的预期数据类型访问正确的内存地址。

【讨论】:

    【解决方案3】:

    您可以将其转换为 int* 以获取指针,如下所示:

    int *ptr = (int *)2;
    

    那么就可以通过普通的 * 操作符来访问 2 的内容了。

    int i = *ptr;
    

    会做你想做的。

    然而,值得注意的是,在实践中,上面的“i”并不是 RAM 的第二个单元格的实际内容。这是因为在用户模式应用程序中,“2”始终被视为虚拟地址,并(在运行时)被转换为物理地址。通常在类 Unix 操作系统的用户模式代码中没有办法做这样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-06
      • 2012-10-03
      • 2010-09-12
      • 2021-10-28
      • 2010-11-01
      • 2013-12-31
      • 2021-01-25
      • 1970-01-01
      相关资源
      最近更新 更多