You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言悬垂指针问题:返回局部变量地址与返回值的差异

为什么返回局部变量的值不会产生悬垂指针问题

核心原因是两种写法返回时拷贝的内容完全不同,函数栈帧销毁带来的影响也完全不一样:

1. 返回局部变量地址的错误逻辑

你第一段代码里return &x返回的是局部变量x的内存地址:

  • 普通局部变量存储在当前函数的栈帧内存中,函数执行结束后整个栈帧会被操作系统回收,这块内存的读写权限会被收回,后续还可能被其他新的函数栈帧覆盖重写
  • 调用方拿到的指针只是存储了这个已经被回收的内存的地址,去访问的时候自然会读到垃圾值,甚至直接触发段错误

2. 返回局部变量值的正确逻辑

你第二段代码里return x返回的是x存储的数值本身,不是它的内存地址:

  • C语言的函数返回值默认走「值拷贝」逻辑,返回整数值时,编译器会把x存的5提前拷贝到专门的返回值存储区域(通常是CPU的通用寄存器,比如x86架构的EAX寄存器,也可能提前在调用方main的栈帧里预留返回值位置)
  • 后续fun函数执行结束,x所在的栈帧销毁完全不影响已经拷贝好的返回值5,赋值给p的时候就是把这个拷贝好的5写到p对应的内存空间,所以完全不会读到垃圾值。

通俗类比:返回地址相当于告诉你一个已经搬走的人的家庭住址,你上门肯定找不到原主人;返回值相当于对方直接把要给你的信息亲口告诉你,对方搬不搬家都不影响你已经拿到的信息。

内容的提问来源于stack exchange,提问作者Ravi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 14:18:03