2

在 VS2010 中运行此代码,我收到如下所示的警告,但控制台上会输出 C 字符串“f()”和“g()”。

问题 1:为什么 f() 会产生警告而 g() 不会?直到程序结束之前,字符串文字是否都保留在静态内存中?

问题 2:当我在 main() 中注释掉对 h() 的调用时,代码会崩溃。为什么会有不同的行为?

#include<iostream>

const char* const& f()
{
   return "f()";            //  warning C4172: returning address of local variable or temporary
}

const char* g()
{
    return "g()";           //  no warning
}

const std::string& h()
{
    return "h()";           //  warning C4172:
}

int main()
{
    std::cout << f() << '\n';
    std::cout << g() << '\n';
//  std::cout << h().c_str() << '\n';       //  comment out and program crashes
}
4

2 回答 2

3

您正在返回对仅在本地使用的值的引用。这是未定义的行为。您可能想要的只是返回一个 char 指针或 a std::string,而不是 char 指针引用或 a std::string&

您碰巧看到f()打印出来的事实只是抽奖的运气。它仍然是未定义的行为,不能指望。

于 2013-03-17T18:18:42.343 回答
2

f() 产生未定义的行为。未定义的行为会使您的程序处于无效状态,从而导致(伪随机)崩溃。

这是未定义的行为,因为您返回对局部变量的引用。函数调用后,局部变量将被销毁,让你的char*指向无处可去,真的。

如果您删除引用,该值将被复制,并且我们没有范围冲突。

于 2013-03-17T18:19:44.897 回答