【问题标题】:Binary Search Tree Insertion throws segmentation Fault二叉搜索树插入引发分段错误
【发布时间】:2015-12-18 09:03:11
【问题描述】:

有人可以解释一下下面的二进制搜索插入代码有什么问题吗?当我尝试插入第二个元素时,它会出现分段错误。

node * insert(node * root, int value)
{
    if(root == NULL){
        node *newnode = (node *)malloc(sizeof(node));
        newnode->data = value;
        newnode->left = NULL;
        newnode->right = NULL;
        root = newnode;
    }
    else{
        if(root->data > value)
            insert(root->left, value);

        if(root->data < value)
            insert(root->right, value);
    }
   return root;
}

int main(){
    node* root = NULL;
    root = insert(root, 5);
    root = insert(root, 10);
}

【问题讨论】:

  • 您好,欢迎来到 StackOverflow。请添加您的节点类型的声明。您确定在 main() 函数中修改了根值吗?
  • 你为什么要返回root?
  • @BlueMoon93:因为它是这样被修改的?
  • @undur_gongor:那么他不应该有“root->left=insert(root->left, value);”吗?我很困惑
  • @BlueMoon93:在某些情况下,必须修改根节点。您可以通过将指针传递给根指针或返回(可能已修改的)根来完成此操作。 an111 使用了第二种方法。目前,仅当树为空时才修改根节点。稍后可能由于重新平衡而需要修改。

标签: c binary-search-tree


【解决方案1】:

您必须包含stdlib.h

否则,编译器不知道malloc 的原型,并假定它返回int 而不是指针。如果您的 ABI 以不同的方式处理指针和整数,则会导致问题。

相应的警告被演员隐藏。

【讨论】:

    【解决方案2】:

    在我看来,这可能导致崩溃的原因有两种:

    • 正如@undur_gongor 所指出的,您不包括stdlib.h,并且在整数和指针大小不同的架构上运行。这完全符合why you shouldn't cast the result of malloc

    • 的原因
    • 您的内存不足。由于您没有检查malloc 的结果,它可能已失败并返回NULL

    【讨论】:

      猜你喜欢
      • 2016-12-04
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多