我有
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()
中遇到了段错误。为什么呢?
答案 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();
这就是全部。 希望这有帮助