返回本地创建的 const char*
Returning a locally created const char*
#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
(局部变量)被赋值为本地创建的字符串字面量的地址,而函数returns时,[=]指向的数据14=] 与 x
指向的相同,即使 x
超出范围。
有人可以详细解释这里发生了什么吗?
这是合式的,返回的指针是有效的,没有悬挂;因为string literal(即"abc"
)是静态存储的,存在于程序的整个生命周期中。
String literals have static storage duration, and thus exist in memory for the life of the program.
正如您所说,当函数 returns 局部变量 x
被销毁时,但它指向的字符串文字没有被销毁。
至于你的功能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";
是局部变量,当超出作用域时会死亡。
#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
(局部变量)被赋值为本地创建的字符串字面量的地址,而函数returns时,[=]指向的数据14=] 与 x
指向的相同,即使 x
超出范围。
有人可以详细解释这里发生了什么吗?
这是合式的,返回的指针是有效的,没有悬挂;因为string literal(即"abc"
)是静态存储的,存在于程序的整个生命周期中。
String literals have static storage duration, and thus exist in memory for the life of the program.
正如您所说,当函数 returns 局部变量 x
被销毁时,但它指向的字符串文字没有被销毁。
至于你的功能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";
是局部变量,当超出作用域时会死亡。