关于函数返回字符串常量的问题
标签(空格分隔):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中是局部变量(在栈中),此时,我们使用引用类型返回该局部变量的(但是,会发生出栈操作),我们的引用变量被释放了,就会出错。但是,如果我们不使用&
,返回的时候我们实际得到的是地址值的中间变量(函数的非引用返回值都会保存在中间变量中),此时栈操作是不影响我们获取正确的地址值的。