C++函数返回局部变量赋值的语义困惑:为何地址不一致?
函数返回局部变量的语义解析
首先看你的原代码:
int my(){ int t=10; cout<<&t<<"\n"; return t; } int main() { const int& c=my(); cout<<&c; return 0; }
输出地址不同的原因很明确:
- 当
my()以值类型(int)返回时,函数会将局部变量t的值拷贝到一个临时对象中,这个临时对象创建在main函数的栈帧里。 - 用
const int&绑定这个临时对象时,C++标准会延长该临时对象的生命周期,直到引用c失效,但这个临时对象和my函数里的t是完全独立的两个对象,内存地址自然不一样。
关于返回int&的错误尝试
如果你把my()的返回类型改成int&,本质是返回局部变量t的引用——这是严重的未定义行为。局部变量t存储在my()的栈帧中,函数执行完毕返回时,该栈帧会被销毁,t占用的内存被释放,返回的引用就成了“悬空引用”,此时对这个引用的任何访问(包括打印地址)都是非法的,结果没有意义。
关于指针传递的错误尝试
同理,若尝试返回局部变量的指针,得到的是悬空指针,指向的内存已不属于当前程序,打印出的地址要么无效,要么是被其他数据覆盖后的无意义值,同样属于未定义行为。
核心要点总结
- 值返回局部变量时,程序会创建临时副本,引用绑定的是这个副本而非原局部变量,因此地址不同。
- 永远不要返回局部变量的引用或指针,局部变量在函数退出后会被销毁,对应的引用/指针会悬空,触发未定义行为。
内容的提问来源于stack exchange,提问作者uvnarayan
相关产品推荐
相关产品推荐

