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

Segmentation fault when assigning pointer to pointer

本文关键字:指针 分段 错误 分配      更新时间:2023-10-16

我有

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()中得到段故障。为什么?

Node* left;

这个只是声明了一个指针。什么都没有。没有Node对象。指针可以指向一个Node对象,但它不会自动给你一个。事实上,left是未初始化的,如果不调用未定义的行为,就不能取消引用。

您需要以某种方式分配Node对象,可能是new:

Node* left = new Node();

但是别忘了加上delete

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

同样适用于main函数中的root

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

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

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

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

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

函数中的

:void build_tree(Node* Node){

Node* left; 

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

left->father=node; //segfault  

——这里你试图访问指针初始化到的对象的成员,但实际上该对象不存在(没有new - constructor语句),因此访问是无效的访问,导致分段错误。

}

来纠正上面的错误,正如前面的一个SO成员(sftrabbit)所回答的那样,你需要在指针初始化之前添加以下语句:Node* left = new Node();

这一切。希望对大家有所帮助