#include <iostream>
const char* fun()
{
const char* x = "abc";
std::cout << "x = " << x << "\n";
return x;
}
int main(int arc, char** argv)
{
const char* y = fun();
std::cout << "y = " << y << "\n";
return 0;
}
在我的计算机上运行此命令可得到:
x = abc
y = abc
在fun()
中,x
(局部变量)被分配了本地创建的字符串文字的地址,但是当函数返回时,y
指向的数据是相同的正如x
所指出的那样,即使x
不在范围之内。
有人可以详细解释这里发生了什么吗?
答案 0 :(得分:4)
格式正确,返回的指针有效且没有悬挂;因为string literal(即"abc"
)具有固定的存储期限,并且存在于程序的整个生命周期中。
字符串文字具有静态的存储期限,因此在程序生命周期内存在内存中。
如您所说,当函数返回局部变量x
时,该变量将被销毁,但它所指向的字符串文字不会被销毁。
答案 1 :(得分:1)
关于您的功能fun
const char* fun(){
const char* x = "abc";
std::cout << "x = " << x << "\n";
return x;
}// the pointer returns but it's content still alive, because it points to string literal
如果将功能fun
更改为以下内容:
const char* fun(){
char x[] = "abc";
std::cout << "x = " << x << "\n";
return x;
}// the pointer returns but it's content died
然后:
const char* y = fun();
std::cout << "y = " << y << "\n";
预期输出(y为”)
因为上面的const char* x = "abc";
不是局部变量,所以string literal
具有静态存储期限,并且存在于程序的整个生命周期中。
在char x[] = "abc";
的对面是局部变量,该变量超出范围将死亡。