【发布时间】:2013-08-22 13:20:00
【问题描述】:
我已将 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。请解释为什么会出现这种情况?
【问题讨论】:
-
没有现代多任务操作系统允许您从其他进程访问内存。不过,您可能想了解shared memory。您不能使用另一个进程内存的一个原因仅仅是因为两个进程都有自己的内存映射,而且无论如何都是virtual memory。如果你在第二个程序中添加了一个全局变量并打印出它的地址,它甚至可能与第一个进程的地址相同。
-
这不是真的。内核模块具有内核权限
-
@Joachim:告诉 ReadProcessMemory API。当然可以,否则您将如何调试?这只是一个特权操作。
-
当我试图 int *p=(int *)0x00402000; 时会发生什么
-
当你在第二个进程中分配指针时,没有什么特别的事情发生,它只是分配。当您稍后尝试在
printf调用中取消引用它时,这是未定义的行为,因为该位置可能没有任何明智的。它甚至可能使程序崩溃。
标签: c windows memory memory-management process