为何两个函数中局部变量x和y的内存地址相同?
你的猜测完全合理,这是栈帧复用的典型表现
你观察到的现象本质是栈内存的复用机制:
- 程序运行时,函数的局部变量、参数、返回地址等数据会被存放在栈帧里,栈帧是栈内存上的一块连续区域。
- 当
foo1执行完毕返回main后,它的栈帧并不会被主动清空,只是栈指针会回退到调用foo1之前的位置,这块内存会被标记为可复用状态。 - 接下来调用
foo2时,系统会直接把空闲的栈空间分配给foo2的局部变量,所以y的地址就和之前x的地址完全一致。
补充几个关键点:
- 这种行为是大多数操作系统和编译器的通用实现,但C语言标准并没有强制要求——标准只规定局部变量的生命周期从函数进入到退出,至于内存是否复用,由具体实现决定。
- 如果把代码改成
foo1内部调用foo2,两个函数的栈帧会同时存在于栈上,此时x和y的地址就会不同。 - 栈内存复用是一种高效的内存管理方式,避免了频繁分配释放内存的开销。
内容的提问来源于stack exchange,提问作者soobinfan
相关产品推荐
相关产品推荐

