为什么不创建字符串变量就不能使用函数的字符串输出?

时间:2018-11-03 09:27:21

标签: c++ string visual-studio visual-c++

我有正确运行的代码:

#include <iostream>

std::string func()
{
    return "string";
}

int main()
{
    std::string str = func();
    std::cout << str << std::endl;
    return 0;
}

但是当我将main函数更改为此时,我没有输出:

int main()
{
    const char* c = func().c_str();
    std::cout << c << std::endl;
    return 0;
}

此主要功能正常工作:

int main()
{
    std::string str = func();
    const char* c = str.c_str();
    std::cout << c << std::endl;
    return 0;
}

我在Visual Studio中使用多字节编码。

1 个答案:

答案 0 :(得分:4)

好吧,由于访问已释放的内存,您的第二个示例是未定义行为。任何事情都会发生。

func()返回一个临时std::string,其生存期在完整表达式的结尾处结束,将c变成一个悬空指针:

const char* c = func().c_str();

禁止使用悬空指针,尤其是取消引用:

std::cout << c << std::endl;

第一个示例通过将返回值存储在变量中并打印该值来避免这种情况。
第三个方法也将返回值存储在变量中,即使出于某种不可思议的原因,它使用指向拥有序列的指针进行输出。