c-如何访问分配给不同进程的内存



我编辑了1.c如下。

#include<stdio.h>
int x=100;
int main(void)
{
    printf("%p",&x);
    while(1);
    return 0;
}

然后我打开命令提示符并运行这个程序,在程序仍在运行时得到输出00402000。现在我运行2.c

#include<stdio.h>
int main(void)
{
    int *p=(int *)0x00402000;
    printf("%d",*p);
    return 0;
}

在命令提示符的另一个实例中,得到了输出-1,我预计100在位置00402000。请解释为什么会有这种行为?

首先,让我说,在现代操作系统中,程序看到的地址值(如0x00402000)是而不是物理地址。它们是虚拟地址,对拥有进程是私有的(即在其他进程中没有意义或意义),并且通过只有操作系统才能控制的基于CPU的机制("分页单元")映射到物理地址。

如果你想在不同的进程之间共享一个变量,有一种机制叫做共享内存。读一下。相关的API是CreateFileMapping,第一个参数是INVALID_HANDLE_VALUEMapViewOfFileOpenFileMapping。还有其他的进程间通信方式。

如果您想在没有进程显式合作的情况下读取进程的内存,您需要了解API的调试。这是一项比使用共享内存更棘手的工作。

顺便说一句,你所编码的是一个典型的未定义行为。

要演示地址空间概念,请将第二个示例修改为:

#include<stdio.h>
int  y = 101;
int main(void)
{
    int *p=(int *)0x00402000;  // hope this works??
    printf("%d",*p);
    printf("%p", p);  // print value of p to ensure correct assignment
    return 0;
}

它可能会打印"101"!!这是因为操作系统对每个地址空间都一视同仁。因此,无论名称如何,int的全局var都可能被分配到位置0x004002000。

看起来是未定义的行为。由于用户的进程只允许访问分配给它的内存。因此,当你试图访问关于地址的内存时,你分配了一个无效的地址,你会遇到未定义的行为。

最新更新