BST实现功能中的分段故障

时间:2017-08-23 15:14:32

标签: c segmentation-fault binary-search-tree

这是我在二进制搜索树中插入项目的实现。

void insert(struct Node* root,int item){
if(root==NULL){
    root = newNode(item); // newNode is a function which creates new node, initialized it with item & return pointer of the new node.
}
if(item < root->item)
    insert(root->left,item);
else
    insert(root->right,item);
}

但我无能为力,为什么在驱动程序中调用后会出现分段错误?

struct Node* root = NULL;
insert(root,50);

1 个答案:

答案 0 :(得分:2)

你可能有无限递归

通过初始调用,root将是一个空指针,这意味着您将创建一个新的根节点。然后我们进入检查if(item < root->item)这将是假的,导致程序执行else子句并递归调用insert

如果newNodeleftright指针设置为NULL,那么整个事情将重新开始,创建一个新节点并转到else }子句并递归调用自身。

解决方案是另一个 else,如

if (root == NULL) {
    ...
} else if (item < root->item) {
    ...
} else {
    ...
}

如果您只是使用调试器来捕获崩溃或单步执行代码,那么您很快就会发现问题 very 。在将来,首先使用调试器来捕获崩溃,并找到它发生的位置和时间,并检查函数调用堆栈。

如果另一方面,newNode 初始化节点结构的leftright指针,那么您将undefined behavior ,这通常会导致崩溃。

malloc等动态分配函数初始化它分配的内存。内存的内容是不确定。取消引用这样的指针会导致所述UB(Undefine Behavior)。

这也可以在调试器的帮助下快速检测到。

最后,如果您将上述内容修复为问题,则崩溃的第三个可能原因是,当您将参数传递给C中的函数时,它将按值传递 。这意味着值被复制到参数中,并且函数内部的参数就像任何其他局部变量一样,一旦参数超出范围,参数(赋值)的所有更改都将丢失。函数返回。

这意味着在初次调用insert后,变量root 仍然仍然是空指针。

我的评论中提到了解决方法。