内存:编译器如何选择存储变量的位置?

时间:2014-12-09 23:15:34

标签: c++ c memory compiler-construction runtime

给定两个函数func1和f2,具有以下签名:

void func1(){
    int baba = 12345;
    // printf the value of baba here
}

void f2(){
    int loo;
    //printf the value of loo here
}

...如果我运行我的int main,它只有func1然后是f2:

int main(){
      func1();
      f2();
}

...那么baba和loo的印刷价值将是12345.所以我的问题如下:

  1. 这是定义的行为,还是我的机器所做的错误?

  2. 如果这不是我的电脑所做的错误,你能否解释为什么编译器选择将loo存储在与baba?相同的地址

  3. 编辑:我想我应该问,如果我有这两个EXACT两个函数,baba和loo在任何机器上都有相同的值吗?

    我理解loo的价值是baba剩余部分的结果,我明白(至少在我的机器上)两者的堆叠正在布置,以便loo重叠到baba的旧区域。 这是真的每台机器都会以这样的方式放置这两个功能堆栈,以便baba和loo重叠吗?完全按照书面形式使用这两个函数,即......

1 个答案:

答案 0 :(得分:10)

f2()中,lolo未初始化。因此,它的内容未定义

然而,大多数情况下,内容似乎是堆栈中的数据。巧合的是,您首先调用func1(),其内存/堆栈布局与f2()完全相同。因此,变量包含先前存储在同一位置的数据。

根本无法保证此行为。它似乎只在这个特定的上下文中工作,因为在两个调用之间没有创建其他局部变量,并且没有其他函数调用用其他内容覆盖数据(并且这两个函数具有完全相同的内存布局)。

这里有一张小图片来解释这个具体情况的情况: enter image description here