分配指针指针时出现分段错误

时间:2013-03-12 10:53:21

标签: c++ pointers segmentation-fault

我有

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 个答案:

答案 0 :(得分:4)

Node* left;

这个只是声明一个指针。没有其他的。没有Node个对象。指针可以指向Node对象,但它不会自动为您提供一个。实际上,left未初始化,如果不调用未定义的行为,则无法取消引用。

您需要以某种方式分配Node个对象,可能使用new

Node* left = new Node();

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

答案 1 :(得分:2)

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

同样适用于root函数中的main

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

答案 2 :(得分:2)

bulid_tree()函数中的左侧在使用它指向父亲之前尚未分配有效值。

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

void build_tree(Node* node)
{
    Node * left = (struct Node *)malloc(sizeof(struct Node));
    left->father=node;     
}

答案 3 :(得分:1)

当存在试图访问无效/不正确的存储器地址的指令时,通常会发生

分段错误。

在你的功能中:     void build_tree(Node * node)     {

Node* left; 

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

left->father=node; //segfault  

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

}

要纠正上述情况,正如SO成员之一(sftrabbit)之前已回答过,您需要在指针初始化之前添加以下语句::     Node * left = new Node();

这就是全部。 希望这有帮助