1
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两次执行的地址相同?

4

3 回答 3

7

每次调用都fun需要自己的位置来存储变量。但是一旦函数返回,变量就不再存在。没有理由不能重复使用该地址。它不一定是,但没有理由不能。

在典型的实现中,堆栈空间用于保存在调用函数时从函数及其局部变量返回所需的信息。当函数返回时,局部变量从堆栈中移除,返回信息从堆栈中弹出,使堆栈回到调用函数时的位置。由于这两个函数调用是相同的,因此它们在两种情况下都以相同的堆栈结束,从而使局部变量具有相同的地址。这是一个有经验的程序员所期望的,但不是依赖的。

于 2013-02-08T07:55:32.413 回答
3

堆栈上正在发生的事情的有点超简单(模糊)的说明。

main()(假设0xtopomain保持不变):

   ~Stack~
==============
= 0xtopomain =
= 0x........ =
==============

第一次执行fun()(推):

   ~Stack~
==============
= 0xothers.. =
= 0xbfb8e610 = <- loc
= 0xmemoffun = <- other memory allocated for fun()
= 0xtopomain =
= 0x........ =
==============

返回main()(弹出):

   ~Stack~
==============
= 0xtopomain = <- Where the hell is loc?!!
= 0x........ =
==============

第二次执行fun()(再次推送):

   ~Stack~
==============
= 0xothers.. =
= 0xbfb8e610 = <- loc's here again
= 0xmemoffun = <- other memory allocated for fun()
= 0xtopomain =
= 0x........ =
==============
于 2013-02-08T08:07:11.083 回答
2

存储在堆栈中的局部变量(一个特殊的内存区域,新推送的变量位于顶部,旧变量位于底部)。当您调用一个函数时,会完成一些操作,例如存储返回地址、参数和寄存器等。但是有一个顺序。并且在返回时,所有推送的变量都从堆栈中弹出。由于您使用的是相同的函数并且在两次调用之间,您不会在主函数中使用任何局部变量,因此您的变量地址应该是相同的。

于 2013-02-08T07:57:54.970 回答