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

Posted

技术标签:

【中文标题】我对下面的代码有两个问题【英文标题】:I have two questions about the code below 【发布时间】:2013-03-17 18:16:08 【问题描述】:

在 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

【问题讨论】:

【参考方案1】:

您将 reference 返回到仅在本地使用的值。这是未定义的行为。您可能想要的只是返回一个字符指针或std::string,而不是字符指针引用或std::string&amp;

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

【讨论】:

【参考方案2】:

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

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

如果您删除引用,则该值将被复制,并且我们不存在范围冲突。

【讨论】:

After the function call the local variable will be destroyed, leaving your char* pointing to nowhere 但是字符串文字不会一直存活到程序结束吗? @user1042389 字面量仍然存在,但指向它的指针已被销毁。 @Xymotech 您的意思是与引用关联的指针(可能)? 是的。内存中某处有一个字符串文字,您的函数创建一个指向它的 char 指针并返回对它的引用,但是当函数返回时指针本身被销毁。所以引用指向随机内存(碰巧它指向的可能有你想要的值,但也可能没有)。 @Xymotech 但是为什么 VS2010 总是在 f() 中返回一个有效地址?因此,您所说的可能是其他编译器可能会以不同的方式执行此操作。是这个主意吗?

以上是关于我对下面的代码有两个问题的主要内容,如果未能解决你的问题,请参考以下文章

比较指针和参考

Android 开发中 对下上两个图层的相关操作问题

[单选题]对下面的表达式描述正确的是: (T/t)(M/m)

未解析的外部符号 C++

c ++中的黑屏消失得很快[重复]

`dict(d1, **d2)` 表达式中的 `**` 是啥意思?