为何不同函数内的局部变量、形参会占用相同的内存地址?
现象原因说明
这个现象是C语言运行时栈帧的复用机制导致的,具体原因如下:
- C语言中函数的形参、非静态局部变量都存储在进程的栈内存区域,函数调用时会在栈顶为当前函数分配独立的栈帧,存储这些数据;函数执行完毕返回时,对应的栈帧会被标记为可回收,栈顶指针回退到调用前的位置,这块内存不会被主动清空,而是留给后续的函数调用复用。
- 你代码中的
foo1和foo2的栈帧结构完全一致:都是接收1个int类型的形参,内部定义1个int类型的局部变量,两个函数的栈帧大小、布局完全相同。 - 你是在
foo1完全执行结束、栈帧被回收之后才调用的foo2,此时foo2的栈帧刚好分配在之前foo1释放的栈内存位置,所以foo2的形参dummy就占用了之前foo1的形参xval的地址,局部变量y刚好占用了之前foo1的局部变量x的地址,最终打印出来地址相同。
注意:这个现象仅在当前代码的调用顺序、函数结构下才会出现,不具备通用性,绝对不要在实际编码中依赖这个地址相同的特性,栈帧的分配逻辑由编译器、运行环境共同决定,只要代码逻辑稍有变化(比如两个函数结构不同、调用中间插入其他函数调用),这个现象就会消失。
内容的提问来源于stack exchange,提问作者Ahmd Sami
相关产品推荐
相关产品推荐

