如果知道变量地址,如何在C ++中检索变量值

时间:2011-03-18 17:32:36

标签: c++ memory pointers memory-management

问候,

我最近开始使用 C ++ 进行编码,遇到了一个我无法找到答案的问题,所以我想也许其他人可能知道答案。

如果您知道变量地址,是否可以从另一个程序中检索变量值?想象一下,我在程序中显示了一个内存地址,如: 0x7fff5fbff758 我希望(在我自己的程序中与第一个程序无关)将 存储在该内存地址中。

这可能吗?如果是这样,有人可以解释我如何。 提前谢谢。

5 个答案:

答案 0 :(得分:3)

C ++没有对此进行评论,无论如何。它完全取决于运行程序的平台。例如,如果您使用的是Windows,则可以使用ReadProcessMemory()函数读取另一个进程的内存(假设您有足够的权限)。

请注意,现代操作系统旨在保护流程不会相互干扰。他们这样做的方法之一是为每个进程提供自己的地址空间。如果不使用特殊的API,进程就无法访问此空间外的内存。

答案 1 :(得分:3)

在今天的操作系统上,程序处理虚拟地址,而不是物理地址。简而言之,一个程序的特定地址不会指向其他程序的相同物理位置。

要在现代操作系统上执行您想要的操作,您可以设置共享内存位置。

但是有一种更简单的方法可以将值从一个程序传递到另一个程序。

如果你只是想知道出于好奇,这是一个很好的问题,你可以看看“虚拟记忆”是什么。

答案 2 :(得分:2)

这是可能的,但它是特定于操作系统的(没有常见的C支持)。通常,您的第二个程序需要具有调试器具有的权限,并使用调试器使用的相同类型的OS调用。

答案 3 :(得分:0)

编辑:这已过时,因为问题已经改变。

如果您知道变量的类型,则可能。

对于int变量,您需要插入

之类的行
int* addr = (int*)0x7fff5fbff758;
std::cout << *addr << std::endl;

在受影响的计划中的某个地方。

在现代操作系统中通常不容易从其他程序访问变量,每个进程都有自己的地址空间,因此不同进程中的相同地址可能映射到不同的物理内存位置。

这取决于操作系统,例如在Linux中,如果要从其他进程执行此操作,则需要跟踪进程,请参阅man ptrace。在这种情况下,您可以使用PTRACE_PEEKDATA读取数据。

答案 4 :(得分:0)

在大多数现代通用操作系统(Windows,Linux等)上,你不能那样做。不同的程序在不同的进程中运行,每个进程都有自己的内存空间。一个地址0x7fff5fbff758可能指向RAM中的地址与另一个地址0x7fff5fbff758不同(如果该地址甚至存在于另一个地址中)。

这就是为什么现代操作系统具有进程间通信机制,如管道,共享内存,COM等。