在 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
}
最佳答案
您将返回一个仅在本地使用的值的引用。这是未定义的行为。您可能想要的只是返回一个 char 指针或 std::string
,而不是 char 指针引用或 std::string&
。
您碰巧看到 f()
打印出来的事实只是运气好而已。它仍然是未定义的行为,并且不能指望。
关于c++ - 我对下面的代码有两个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15464365/