我有两个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
答案 0 :(得分:5)
“a”的地址位于程序的堆栈框架上。这是一个虚拟地址,与您的程序实际加载的物理内存无关。因此,如果两个(几乎相同的)程序使用相同的地址,那就不足为奇了。
答案 1 :(得分:4)
因为OS中的每个应用程序都在自己的内存空间中运行。
地址0x7fffffffe1cc不是真正的物理地址。这是由于安全性 - 您无法直接处理其他进程内存。您也无法直接处理设备。
答案 2 :(得分:1)
您的操作系统很可能正在使用Virtual Memory进行内存管理。这意味着在给定程序中找到的地址不是1:1映射到物理内存。这允许许多事情(包括通过页面交换到磁盘运行需要大量内存的多个程序)。
如果没有虚拟内存,如果要分配static int a
而不是将其放在堆栈中,链接器最好选择一个地址。如果您随后链接了另一个程序,它不知道其他程序可能正在使用该地址。运行两个程序可能会踩到另一个程序的内存。使用虚拟内存,每个程序都拥有自己的内存片段,并拥有自己的地址0x0
和自己的地址0x7fffffffe1cc
。