【问题标题】:Segmentation fault in a function of BST implementationBST实现的功能中的分段错误
【发布时间】:2017-08-23 15:14:32
【问题描述】:

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

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);

【问题讨论】:

  • 我建议你做一些关于在c中模拟通过引用传递的研究。
  • 您是否尝试过将调试器指向您的二进制文件以查看崩溃发生的位置?
  • @MortenJensen Debugger 反复关闭 IDE。无法使用。
  • 请告诉我们minimal reproducible example

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


【解决方案1】:

你可能有无限递归

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

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

解决方案是另一个else,如

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

如果您只是使用 调试器 来捕捉崩溃或单步调试代码,您会很快非常发现问题。将来,首先使用调试器来捕获崩溃,并定位它发生的位置和时间,并检查函数调用堆栈。


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

malloc 这样的动态分配函数不会初始化它分配的内存。内存的内容是不确定的。取消引用此类指针会导致上述 UB(未定义行为)。

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


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

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

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

【讨论】:

  • 谢谢,但仍然显示分段错误。实际上我正在尝试使用反复关闭 IDE 的 IDE 调试器。
  • @Rohit。用另外两个可能的问题更新了我的答案。在修复第一个之后,最后一个(第三个)是最有可能的罪魁祸首。
  • 谢谢。这是第三个错误。 :-)
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多