繁体   English   中英

内存中的不同程序,相同变量,相同地址

[英]Different programs, same variables, same address in memory

我有两个C代码。 test.c是

#include <stdlib.h>

int main ()
{
    int a;
    a = 5;
    return a;
}

test2.c是

#include <stdlib.h>

int main ()
{
    int a;
    a = 6;
    return a;
}

当我运行它们时,我用gdb检查了“ a”内存中的地址,我得到了相同的地址。 为什么会这样呢?

断点1,在test.c:7的main()返回7; (gdb)打印&a $ 1 =(int *)0x7fffffffe1cc

断点1,在test2.c:7的main()返回7; (gdb)打印&a $ 1 =(int *)0x7fffffffe1cc

地址“ a”在程序的堆栈框架中。 这是一个虚拟地址,与程序实际加载到物理内存中的位置无关。 因此,如果两个(几乎相同)的程序都使用相同的地址就不足为奇了。

因为OS中的每个应用程序都在其自己的内存空间中运行。

地址0x7fffffffe1cc不是真正的物理地址。 这是出于安全考虑-不能像这样直接处理其他进程内存。 您也不能直接处理设备。

你可以在这里这里阅读更多

您的操作系统很有可能正在使用虚拟内存进行内存管理。 这意味着在给定程序中找到的地址未1:1映射到物理内存。 这允许很多事情(包括运行多个需要通过页面交换到磁盘来占用大量内存的程序)。 如果没有虚拟内存,则如果要分配static int a而不是将其放在堆栈上,则链接程序将最好为它选择一个地址。 如果您随后链接了另一个程序,它将不知道还有哪些其他程序正在使用该地址。 运行两个程序可能会占用另一个程序的内存。 使用虚拟内存,每个程序都使用自己的地址0x0和自己的地址0x7fffffffe1cc获取自己的内存片。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM