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

oma*_*al8 0 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;
}
Run Code Online (Sandbox Code Playgroud)

我期待得到'c'作为输出,但它输出'}'.我觉得它必须与将"数据"指针分配给一个匿名变量'c'有关.

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

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

我想知道导致意外输出的是什么.

nio*_*nio 6

在你的班上:

Node(char d)
{
   data = &d;
}
Run Code Online (Sandbox Code Playgroud)

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