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

时间:2014-03-18 13:07:44

标签: c 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”s内存中的地址时,我得到相同的地址。为什么会这样?

  

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

     

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

地址0x7fffffffe1cc不是真正的物理地址。这是由于安全性 - 您无法直接处理其他进程内存。您也无法直接处理设备。

您可以详细了解herehere

答案 2 :(得分:1)

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