给定两个函数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.所以我的问题如下:
这是定义的行为,还是我的机器所做的错误?
如果这不是我的电脑所做的错误,你能否解释为什么编译器选择将loo
存储在与baba?
相同的地址
编辑:我想我应该问,如果我有这两个EXACT两个函数,baba和loo在任何机器上都有相同的值吗?
我理解loo的价值是baba剩余部分的结果,我明白(至少在我的机器上)两者的堆叠正在布置,以便loo重叠到baba的旧区域。 这是真的每台机器都会以这样的方式放置这两个功能堆栈,以便baba和loo重叠吗?完全按照书面形式使用这两个函数,即......
答案 0 :(得分:10)
在f2()
中,lolo
未初始化。因此,它的内容未定义。
然而,大多数情况下,内容似乎是堆栈中的数据。巧合的是,您首先调用func1()
,其内存/堆栈布局与f2()
完全相同。因此,变量包含先前存储在同一位置的数据。
根本无法保证此行为。它似乎只在这个特定的上下文中工作,因为在两个调用之间没有创建其他局部变量,并且没有其他函数调用用其他内容覆盖数据(并且这两个函数具有完全相同的内存布局)。
这里有一张小图片来解释这个具体情况的情况: