关于函数返回字符串常量的问题

关于函数返回字符串常量的问题

标签(空格分隔):c/c++


  • 首先看下面的代码

    // 此处省略头文件预处理语句
    
    using namespace std;
    
    const string& Func()  // &去掉
    {
        return "123";
    }
    
    int main()
    {
        string s = Func();
    
        cout << s << endl;
    
        return 0;
    }
    

    在g++编译下会报错:

      很多人会认为是函数Func中的"123"是局部变量,存放于栈中,因为是引用(返回值没有临时变量),函数返回的时候出栈,就会出错,其实不然。
      但是,一旦我们将函数Func的返回值类型中的&去掉就可以正常执行。原因如下:

      这段代码确实会报错,但是只要把 const string& Func() 中的 & 去掉就可以了。出错的原因并不是"123"在栈中,当函数返回时出栈导致的错误。而是,"123"本身是在静态数据区的,当函数返回时实际返回的是"123"在静态数据区的地址,该地址在函数Func中是局部变量(在栈中),此时,我们使用引用类型返回该局部变量的(但是,会发生出栈操作),我们的引用变量被释放了,就会出错。但是,如果我们不使用 & ,返回的时候我们实际得到的是地址值的中间变量(函数的非引用返回值都会保存在中间变量中),此时栈操作是不影响我们获取正确的地址值的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值