为什么局部变量的地址对于不同的执行是相同的
Why is the address of a local variable identical for different executions?
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
对于两个执行都是相同的呢?
fun
的每个调用都需要自己的位置来存储变量。但是一旦函数返回,变量就不存在了。没有理由不能重复使用该地址。不一定要这样,但也没有理由不这样。
在一个典型的实现中,堆栈空间用于保存调用函数时从函数及其局部变量返回所需的信息。当函数返回时,局部变量从堆栈中删除,返回信息从堆栈中弹出,使堆栈回到调用函数时的位置。由于这两个函数调用是相同的,因此在这两种情况下,它们最终得到的堆栈都相同,从而使局部变量具有相同的地址。这是一个有经验的程序员所期望的,但不是依赖的。
对堆栈上发生的事情的一个有点过于简单(模糊(的说明。
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........ =
==============
存储在堆栈中的本地变量(一个特殊的内存区域,新推送的变量位于顶部,旧变量位于底部(。当你调用一个函数时,会执行一些操作,如存储返回地址、参数和寄存器等。但这是有顺序的。在返回时,所有推送的变量都会从堆栈中弹出。由于您使用的是同一个函数,并且在两个调用之间,您在主函数中不使用任何局部变量,因此预计您的变量地址是相同的。
相关文章:
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 返回对局部变量 - C++ 的引用
- 是否可以影响 C++ 中回调函数的局部变量?
- 警告 C4101 未引用的局部变量
- 为什么局部变量的地址对于不同的执行是相同的