【问题标题】:Segfault while inserting to binary tree插入二叉树时出现段错误
【发布时间】:2022-11-05 02:05:43
【问题描述】:

当我在我的头结构中时如何使用指针将新节点插入二叉树:

typedef struct bst_node {
  char key;               
  int value;         
  struct bst_node *left; 
  struct bst_node *right; 
} bst_node_t;

在 void 参数中使用双指针时如何分配内存?当我尝试在测试中运行它时,我得到了段错误

void bst_insert(bst_node_t **tree, char key, int value) {
  if(tree == NULL){
    tree = malloc(sizeof(struct bst_node));
    (*tree)->key = key;
    (*tree)->value = value;
    (*tree)->right = NULL;
    (*tree)->left =NULL;
  }
  else if(key == (*tree)->key){
    (*tree)->value = value;
  }
  else if((*tree)->key > key){
    bst_insert(&(*tree)->left, key, value);
  }else{
    bst_insert(&(*tree)->right, key, value);
  }
}

【问题讨论】:

  • if (tree == NULL){ tree = ... 是错误的。应该是if (*tree == NULL) { *tree = ...
  • 是的,但最好同时检查tree*tree,更优选IMO 使用单个* 并返回一个函数值而不是void
  • 如果您首先将双指针转换为单指针,则正确编写代码会容易得多,例如bst_node_t *node = *tree;。然后所有的代码都可以用node而不是(*tree)编写,使代码更容易阅读和理解。您必须记住的一件事是*tree = node; 行,它更新了tree 指向的指针。在给定的代码中,只需要在第一个if 子句末尾的一个地方。

标签: c malloc binary-tree


【解决方案1】:

您的函数需要一个指向bst_node_t 的指针。如果bst_insert 收到bst_node_t **treeNULL,则该函数无能为力,因为它无法访问树。

void bst_insert(bst_node_t **tree, char key, int value) {
  if(tree == NULL){
    return; //There is nothing to be done.

另一方面,如果指针指向tree指着NULL,那么我们有一个对空树结构的有效引用,所以我们可以分配内存并将其存储(指向)它在tree指向的内存位置:

  if(*tree == NULL){
    *tree = malloc(sizeof(struct bst_node)); //What if malloc fails?
    (*tree)->key = key;
    (*tree)->value = value;
    (*tree)->right = NULL;
    (*tree)->left =NULL;
  }

原始程序中的tree = malloc(... 行不仅不是您想要的,而且是内存泄漏,因为当bst_insert 返回时,该值将丢失,您将无法使用free 内存。

由于此函数可能会失败,就像您要调用 bst_insert(NULL, 0, 0); 一样,明智的做法是将返回类型从 void 更改为 int,以便 bst_insert 可以与其调用者沟通它无法做它的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2019-09-23
    • 1970-01-01
    • 2016-12-04
    • 2013-07-15
    相关资源
    最近更新 更多