gpt4 book ai didi

c - 静态变量的地址相同但局部变量的地址不同

转载 作者:太空宇宙 更新时间:2023-11-04 03:36:59 25 4
gpt4 key购买 nike

我正在尝试学习操作系统。目前我在虚拟寻址。哪本书说如果我们有一个 static variable 和一个 local variable 并且我们更新它们并休眠一段时间并尝试打印它们的地址然后跨多个这样的进程运行一个将获得相同的内存地址。

这是因为每个进程都感觉它拥有整个内存并且无法控制物理内存,所以地址将在同时运行的各个进程之间保持相同。我理解这一点,但是当我运行我的程序时,我在静态变量中得到相同的地址,但在局部变量中得到不同的地址。凭借我对操作系统的了解,我无法理解为什么会这样。这是我的代码

int staticvar = 0;

int main(int argc, char const *argv[])
{
int localvar = 0;
staticvar += 1;
localvar += 1;
sleep(10);
printf("static address: %x, value: %d\n", &staticvar, staticvar );
printf("static address: %x, value: %d\n", &localvar, localvar );
return 0;
}

这是我同时运行三个不同进程时的输出。

./a.out 
static address: 60104c, value: 1
static address: 67c6128c, value: 1

./a.out
static address: 60104c, value: 1
static address: 89e2c11c, value: 1

./a.out
static address: 60104c, value: 1
static address: 226e03dc, value: 1

最佳答案

局部变量分配在被调用函数的栈帧上。堆栈帧通过堆栈指针 (SP) 寄存器引用,堆栈指针 (SP) 寄存器在进程启动时由操作系统初始化。该程序使用 SP 动态分配堆栈空间并查找存储在那里的值。因此,这种类型的访问准备使用动态地址,并且知道这一点,操作系统可以选择在当前上下文中认为最合适的任何地方初始化进程的堆栈框架。

另一方面,“静态”变量通常由编译(汇编)代码中的常量地址引用。这就是为什么它们必须驻留在编译时已知的位置。

编辑:

正如有人指出的那样,SP 的值会随着程序的执行而变化,具体取决于堆栈的使用情况。因此,如果从程序的不同部分调用同一个函数,局部变量的地址甚至可能每次都不同。

关于c - 静态变量的地址相同但局部变量的地址不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31782297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com