int fun(int x);
int main()
{
fun(10);
fun(11);
return 0;
}
int fun(int x)
{
int loc;//local variable
cout<<&loc;
return 0;
}
输出
0xbfb8e610
0xbfb8e610
这里loc是一个局部变量,在第一次执行函数f(10)
后超出范围,然后再次分配给fun(11)
的下一次执行。因此,根据我的理解,loc
变量的地址必须不同。那么为什么执行地址&loc
相同?
答案 0 :(得分:7)
fun
的每次调用都需要自己的位置来存储变量。但是一旦函数返回,变量就不再存在。地址无法重复使用是没有理由的。它不一定是,但没有理由不能。
在典型的实现中,堆栈空间用于保存在调用函数时从函数返回所需的信息及其局部变量。当函数返回时,局部变量将从堆栈中删除,并返回返回信息,使堆栈返回调用函数时的位置。由于两个函数调用是相同的,因此它们在两种情况下都与堆栈相同,使得局部变量具有相同的地址。这是有经验的程序员所期望的,但不依赖于。
答案 1 :(得分:3)
对堆栈中发生的事情进行了一些过于简单化(模糊)的说明。
main()
(假设0xtopomain
保持不变):
~Stack~
==============
= 0xtopomain =
= 0x........ =
==============
首次执行fun()
(推送):
~Stack~
==============
= 0xothers.. =
= 0xbfb8e610 = <- loc
= 0xmemoffun = <- other memory allocated for fun()
= 0xtopomain =
= 0x........ =
==============
返回main()
(pop):
~Stack~
==============
= 0xtopomain = <- Where the hell is loc?!!
= 0x........ =
==============
第二次执行fun()
(再次推送):
~Stack~
==============
= 0xothers.. =
= 0xbfb8e610 = <- loc's here again
= 0xmemoffun = <- other memory allocated for fun()
= 0xtopomain =
= 0x........ =
==============
答案 2 :(得分:2)
存储在堆栈中的局部变量(一个特殊的存储区域,新的推送变量保持在顶部,旧的变量保持在底部)。当您调用某个函数时,会执行一些操作,例如存储返回地址,参数和寄存器等。但是有一个命令。在返回时,所有推送的变量都从堆栈中弹出。由于您使用相同的函数并且在两个调用之间,您不使用main函数中的任何局部变量,因此预期您的变量地址是相同的。