结构和指针的成员,C ++

时间:2010-11-06 01:35:07

标签: c++ pointers struct

我有以下代码片段:

struct Node
{
    Node* left;
    Node* right;
    string data;
};    

void test()
    {
        Node thing;
        thing.data = "h";
        thing.left = NULL;
        thing.right = NULL;

        cout<< "Thing data = " << thing.data << endl;

        Node* thing2;
        thing2->data = "f";
        thing2->left = NULL;
        thing2->right = NULL;

        cout<< "Thing2 data = " << thing2->data << endl;

    }

我遇到的问题是thing2-&gt; data =“f”在运行时产生分段错误。我通过GDB运行程序并得到此错误,但我无法弄清楚它的含义:

  

读取共享库的符号++。 DONE   事情数据= h

     

编程接收信号   EXC_BAD_ACCESS,无法访问   记忆。原因:13地址:   0x0000000000000000 0x00007fff874d59a3   在std :: string :: assign()

任何帮助都会很棒。谢谢!

3 个答案:

答案 0 :(得分:2)

thing2是一个非初始化指针。 它没有指向有效的Node对象。

你应该分配它:

thing2 = new Node;

或使其指向有效的Node对象:

thing2 = & thing;

答案 1 :(得分:1)

thing2是指向Node的指针,但您没有指出任何内容:

    Node* thing2 = new Node;
    thing2->data = "f";
    thing2->left = NULL;
    thing2->right = NULL;

    cout<< "Thing2 data = " << thing2->data << endl;
    delete thing2;

上面的代码在堆上分配一个Node,并将其分配给thing2。当它完成对象时,它会删除它。

更惯用的方法是使用智能指针:

#include <memory>
...
    std::auto_ptr<Node> thing2(new Node);
    thing2->data = "f";
    thing2->left = NULL;
    thing2->right = NULL;

    cout<< "Thing2 data = " << thing2->data << endl;

由于auto_ptr的析构函数删除了它所指向的内容,因此您无需显式删除该对象。

答案 2 :(得分:1)

thing2被声明为一个指针,你永远不会(通过new,malloc,甚至在堆栈上)分配该指针指向的实际节点。因此,node2指向显然位于程序地址空间之外的某些未知内存位,当您尝试通过thing2->data = "f"调用修改该内存时,操作系统会通过禁止它来正确地保护自己(和您)。这就是seg。故障就是这样。