【问题标题】:Different programs, same variables, same address in memory不同的程序,相同的变量,相同的内存地址
【发布时间】:2014-04-24 04:37:24
【问题描述】:

我有两个 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,main() at test.c:7 7 return a; (gdb) 打印 &a $1 = (int *) 0x7ffffffffe1cc

断点1,main() at test2.c:7 7 return a; (gdb) 打印 &a $1 = (int *) 0x7ffffffffe1cc

【问题讨论】:

  • 为什么不呢?两个程序是相等的(常量值除外)。你不是在检查56的地址(没有这个东西),你是在检查a的地址。
  • 您的意思是:同时运行它们吗?
  • @david.pfx 我先运行 test.c,然后运行 ​​test2.c

标签: c memory


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    您可以阅读更多关于 herehere 的信息

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-23
        • 2017-12-01
        • 2015-10-25
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多