C++ 在c+;中从字符串转换为常量字符*时输出异常+;
考虑一下下面的MWEC++ 在c+;中从字符串转换为常量字符*时输出异常+;,c++,C++,考虑一下下面的MWE std::string return_string() { return "this is a string" } int main() { const char *y = return_string().c_str(); std::string str = return_string(); const char *x = str.c_str(); std::cout << return_string() <&l
std::string return_string()
{
return "this is a string"
}
int main()
{
const char *y = return_string().c_str();
std::string str = return_string();
const char *x = str.c_str();
std::cout << return_string() << std::endl; //Prints "this is a string"
std::cout << y << std::endl; // Prints Weird characters
std::cout << x << std::endl; //Prints "this is a string"
std::cin.ignore();
return 0;
}
std::string return\u string()
{
return“这是一个字符串”
}
int main()
{
const char*y=return_string().c_str();
std::string str=return_string();
const char*x=str.c_str();
std::cout当您执行return_string().c_str()
操作时,您将获得指向临时对象的指针,该临时对象在表达式完成后将超出范围。如果保存指针并稍后使用,您将具有未定义的行为
与
复制返回的临时对象。获取指向该副本的指针将起作用,因为在使用指针时,它仍然存在于程序中
const char *y = return_string().c_str();
如果您希望稍后使用y
访问内容,则会出现问题。在该行中,return\u string()
的返回值是一个临时值,在执行该行后会被销毁。因此,y
是悬空指针
访问悬空指针的内容会导致未定义的行为
当你使用
std::string str = return_string();
const char *x = str.c_str();
只要str
在范围内,x
就不是悬空指针。因此
std::cout << x << std::endl;
std::cout您不能“从string
转换为const char*
”。不存在这种情况,因为const char*不包含字符。它不是字符串!它只指向某个地方的某些字符
在本例中,通过std::string::c_str()
,它指向不再存在的字符。在return_string
中返回的字符串是临时字符串。指针(如char*
)不会保留那个暂时的生命。顺便说一句,今天似乎是一个缓慢的一天。每个人都在竞相为一个被问了十几次的问题写下自己的答案。@voidlife:你不用担心。回答者更清楚。重复:还有更多,tooDuplicates第二轮:重复第三轮
std::cout << x << std::endl;