我知道"文字"(c字符串,int或其他)存储在某处(在一个只读数据部分显然是.rodata)也许这不准确......
我想了解为什么此代码导致运行时错误:
#include <iostream>
using namespace std;
const int& foo()
{
return 2;
}
const char* bar()
{
return "Hello !";
}
int main() {
cout << foo() << endl; // crash
cout << bar() << endl; // OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)
foo返回一个文字的const引用(2)为什么会导致崩溃?是存储在foo()堆栈中的整数2?
我明白为什么这会令人困惑所以我会试着把它分解.
第一种情况:
const int& foo()
{
return 2;
}
Run Code Online (Sandbox Code Playgroud)
return语句创建一个临时对象,它是文字的副本2.所以它的地址要么不存在,要么与文字的位置不同2(假设文字2有一个位置 - 不保证).
这是临时的,其引用被返回.
第二种情况:
const char* bar()
{
return "Hello !";
}
Run Code Online (Sandbox Code Playgroud)
return语句使得临时对象其是复制一个的指针到地址的的第一个元素的字面char数组.该指针包含文字数组的实际地址,该地址由副本返回给调用者.
所以总结一下.第二个是有效的,因为return语句采用文字地址的副本而不是文字本身的副本.地址的存储是临时的并不重要,因为在临时保持其值崩溃之后,地址仍然指向正确的位置.