c++ - 我对下面的代码有两个问题

标签 c++ string compiler-warnings c-strings

在 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/

相关文章:

c++ - 函数指针 - 2 个选项

java - 是否有更有效的方法来迭代字符串直到到达某个字符?

java - intelliJ 是否具有字符串替换功能?

亚搏体育appGitLab CI : How to fail on new compiler warnings

c++ - 删除后我应该分配我的指针 0 吗?

c++ - 带有动态数组的 std::max

c++ - 设置读取游标失败

c++ - 如何在 mongocxx (c++) 中抑制字段?

PHP $string{0} 与 $string[0];

c++ - 无法在 VS2015 中禁用编译器警告