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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:00:00