【问题标题】:Trying to keep an anonymous variable alive in C++试图在 C++ 中保持匿名变量处于活动状态
【发布时间】:2017-12-05 11:29:17
【问题描述】:

这个简单的代码块的行为出人意料。

#include <iostream>
using namespace std;


class Node
{
 public:
    char* data;
    Node(char d)
    {
       data = &d;
    }
};


int main()
{
   Node NodeA = Node('c');
   cout<<*(NodeA.data)<<endl;
   return 0;
}

我希望得到“c”作为输出,但它却输出了“}”。 我有一种感觉,它必须与将“数据”指针分配给匿名变量“c”有关。

我发现这个question 讨论了一个类似的问题。

但是正如在上面的答案中提到的那样,只有在表达式末尾没有引用它的指针限制匿名变量时,它才会被杀死。我认为这里不是这种情况,因为我将指针(“数据”)绑定到它,但不知何故它仍然被杀死。

我想知道导致意外输出的原因。

【问题讨论】:

  • 您没有将指针指向匿名'c',而是将指针指向参数 d'c'按值 传递给您的 Node(char d)
  • 你称它为匿名的——但有趣的是d——我称之为本地。当局部变量超出范围时,您认为指针会发生什么?

标签: c++ scope


【解决方案1】:

在你的课堂上:

Node(char d)
{
   data = &d;
}

char d 是构造函数 Node 的参数。问题是 d 只存在于程序堆栈的本地范围内。当代码从构造函数返回时,它不再存在。 data 现在有一个指向程序堆栈中某处的地址。如果您尝试读取数据,您可以读取稍后推送到堆栈上的其他内容。如果您写入此地址,您将覆盖程序中的其他一些变量。它可能会崩溃或只是做一些意想不到的事情。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2014-06-18
    • 2012-01-03
    • 2014-11-16
    相关资源
    最近更新 更多