我已经编辑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的位置。请解释为什么是这种行为?
防止内存碎片
Linux如何知道进程使用了多less物理内存?
OOM杀手(内存不足)与大量的内存(?!) – inotify
当多个用户同时访问时,多less程序/类的拷贝被加载到内存中
如何确定linux中的可用物理内存
八度 – 内存不足或维度过大,八度的索引types
从用户模式访问内核内存(Windows)
Linux:如何获得进程使用的交换?
在Windows中,我怎样才能用`new`replace`GlobalAlloc`?
首先,让我说在现代操作系统中,程序看到的地址值(如0x00402000) 不是物理地址。 它们是虚拟地址,它们对于拥有进程是私有的(即在其他进程中没有意义或者意味着别的东西),并且通过基于cpu的机制(“分页单元”)映射到物理地址,只有OS具有掌控。
如果你想在不同的进程之间共享一个变量,就有一种称为共享内存的机制。 阅读它。 相关的API是CreateFileMapping ,第一个参数是INVALID_HANDLE_VALUE , MapViewOfFile , OpenFileMapping 。 还有其他的进程间通信方式。
如果你想读取进程的“内存没有这个进程”明确的合作,你需要阅读调试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”! 这是因为OS将每个地址空间视为相同。 所以, int全局变量var不管它的名字可能被分配到位置0x004002000。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。