试图在C ++中保持匿名变量的存活

时间:2017-12-05 11:29:18

标签: c++ scope

这个简单的代码块以意想不到的方式运行。

#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;
}

我期待得到&#39; c&#39;作为输出,但它输出&#39;}。 我觉得它必须与分配&#34;数据&#34;指向匿名变量的指针,该变量是&#39; c&#39;。

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

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

我想知道导致意外输出的内容。

1 个答案:

答案 0 :(得分:5)

在你班上:

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

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