【发布时间】:2017-08-01 17:20:10
【问题描述】:
以下代码编译并运行,没有错误并具有预期的输出:
#include <string>
#include <iostream>
using namespace std;
string getString()
{
char s[] = "Hello world!";
return s;
}
int main()
{
cout << getString() << endl;
}
我的问题是,这会一直有效吗?通常,如果您返回一个在本地声明的 C 字符串,您可能会遇到一些未定义的行为,但在这种情况下,这仍然是一个问题,因为它是通过字符串构造函数运行并(可能)复制到动态内存中的?
【问题讨论】:
-
std::string添加到标准库的主要原因之一 - 它可以用作像int和double这样的嵌入式类型,所以可以按值返回std::string. -
你知道字符串litterals有静态存储持续时间:cpp-ref。因此,如果您的 c 字符串仅指向
const char* s="Hello World"中的字符串文字,您可以安全地从函数中返回它,因为 s 是指向具有静态存储持续时间的对象的指针。这就是std::except::what()或type_info::name()返回 c 字符串的原因 -
@Oliv 这是一个很好的事实,但这只是一个例子,在我的真实程序中,C 字符串是在运行时创建的