在C中取消引用任意内存位置

时间:2010-02-16 05:08:05

标签: c memory pointers dereference

我正在尝试调试我编写的程序。根据调试器,特定void *保持值0x804b008。我希望能够取消引用此值(将其转换为int *并获取它的值)。

我收到此代码的分段错误。 (void *的程序仍然在后台运行 - 它已暂停')

#include <stdio.h>

int main() {
    int* pVal = (int *)0x804b008;
    printf("%d", *pVal);
}

我可以看到为什么能够尊重记忆中的任何一点都可能是危险的,所以也许这就是为什么这不起作用。

谢谢!

2 个答案:

答案 0 :(得分:7)

您的程序(在调试器中运行)并且该程序不会在同一虚拟内存空间中运行;访问该指针(即使它是有效的指针)也不会给你任何信息。

您计算机上运行的每个程序都有自己的逻辑地址空间。您的操作系统,编程语言运行时和其他因素可能会影响您看到用作任何给定程序的指针的实际文字值。但是一个程序绝对无法看到另一个程序的内存空间,当然除了软件调试器,它们会做一些特殊的技巧来支持这种行为。

在任何情况下,假设您有一个有效的地址,您的调试器应该让您在程序暂停时看到您想要的任何内存。在gdb x/x 0x804b008中,您可以获得想要查看的内容。

了解更多信息:

  1. 关于Virtual Memory的维基百科文章。
  2. gdb documentation

答案 1 :(得分:0)

这很简单。操作系统知道该地址不属于您的程序,因此您无法在不绕过内存保护的情况下进行打印。