0

我有

struct Node{
    Node* father;
    Node* left_son;
    Node* right_son;
    char content;
};

void build_tree(Node* node){
    Node* left;
    left->father=node; //segfault
}

void init(){
    Node* root;
    build_tree(root);
}

我在build_tree(). 为什么?

4

4 回答 4

4
Node* left;

只是声明了一个指针。没有其他的。没有Node对象。指针可以指向一个Node对象,但它不会自动给你一个。事实上,它left是未初始化的,并且不能在不调用未定义行为的情况下取消引用。

您需要以Node某种方式分配一个对象,也许是new

Node* left = new Node();

但是,请确保您不要忘记delete它。

于 2013-03-12T10:55:34.237 回答
2

你没有初始化left,所以它指向一个看似随机的位置。取消引用随机指针会导致未定义的行为,这通常会导致崩溃。

这同样适用rootmain函数。

您需要在使用它们之前分配节点。

于 2013-03-12T10:54:12.853 回答
2

函数中的left在bulid_tree()你使用它指向父亲之前没有被分配一个有效的值。

不知道是干什么build_tree()用的。但只是为了解决这个问题,您将代码更改为:

void build_tree(Node* node)
{
    Node * left = (struct Node *)malloc(sizeof(struct Node));
    left->father=node;     
}
于 2013-03-12T11:00:06.770 回答
1

当有一条指令试图访问无效/不正确的内存地址时,通常会发生分段错误。

在你的函数中: void build_tree(Node* node) {

Node* left; 

-- 这会创建一个指针,该指针未初始化为指向应该存在的某个对象。

left->father=node; //segfault  

- 在这里,您试图访问指针已初始化为的对象的成员,但实际上该对象不存在(不存在新的构造函数语句),因此访问是无效访问,导致分段错误。

}

要更正上述问题,作为 SO 成员之一(sftrabbit)之前已回答,您需要在指针初始化之前添加以下语句 :: Node* left = new Node();

就这样。希望这可以帮助

于 2013-03-13T04:29:01.607 回答