这是我在二进制搜索树中插入项目的实现。
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);
答案 0 :(得分:2)
你可能有无限递归。
通过初始调用,root
将是一个空指针,这意味着您将创建一个新的根节点。然后我们进入检查if(item < root->item)
这将是假的,导致程序执行else
子句并递归调用insert
。
如果newNode
将left
和right
指针设置为NULL
,那么整个事情将重新开始,创建一个新节点并转到else
}子句并递归调用自身。
解决方案是另一个 else
,如
if (root == NULL) {
...
} else if (item < root->item) {
...
} else {
...
}
如果您只是使用调试器来捕获崩溃或单步执行代码,那么您很快就会发现问题 very 。在将来,首先使用调试器来捕获崩溃,并找到它发生的位置和时间,并检查函数调用堆栈。
如果另一方面,newNode
不初始化节点结构的left
和right
指针,那么您将undefined behavior ,这通常会导致崩溃。
malloc
等动态分配函数不初始化它分配的内存。内存的内容是不确定。取消引用这样的指针会导致所述UB(Undefine Behavior)。
这也可以在调试器的帮助下快速检测到。
最后,如果您将上述内容修复为问题,则崩溃的第三个可能原因是,当您将参数传递给C中的函数时,它将按值传递 。这意味着值被复制到参数中,并且函数内部的参数就像任何其他局部变量一样,一旦参数超出范围,参数(赋值)的所有更改都将丢失。函数返回。
这意味着在初次调用insert
后,变量root
仍然仍然是空指针。
我的评论中提到了解决方法。