Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+;中从字符串转换为常量字符*时输出异常+;_C++ - Fatal编程技术网

C++ 在c+;中从字符串转换为常量字符*时输出异常+;

C++ 在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

考虑一下下面的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() << 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;