在 C 中重新分配空指针



我正在制作二叉树是C。我知道如何制作二叉树,这不是这里的问题。

我为根和将添加到树中的所有元素使用 void 指针。

当二叉树为空(根指向 NULL(时,我只是将根指向将成为树的第一个元素的元素。但是root没有得到它应该指向的元素的地址。这只是一个简单的重新分配。

正如我上面提到的,我正在尝试对 void 指针进行简单的重新分配,以便为根分配一个新地址。

但是当我将元素的各个值分配给根时,一切似乎都很好。

表示二叉树的所有元素。

struct node {
  void * key;
  void * value;
  struct node * left;
  struct node * right;
};

第一种方法:失败的简单重新分配

void map_tree_put(struct node * root, struct node * ele){
    if(root==NULL) {
      root = ele;
    }
    else {
      /* some other code*/
    }
}

第二种方法:单个值分配工作正常

void map_tree_put(struct node * root, struct node * ele){
    if(root==NULL) {
      root->key = ele.key;
      root->value = ele.value;
      root->left = NULL;
      root->right = NULL;
    }
    else {
      /* some other code*/
    }
}

测试代码

int main() {
  struct node * r = NULL;
  int key = 10;
  int value = 100;
  struct node ele = {&key, &value, NULL, NULL};
  map_tree_put(r, &ele);
  printf("%dn", *(int*)r->key); /* I get segmentation fault over here with the first approach but work fine with the second approach */

  return 0;
}

试试

void map_tree_put(struct node ** root, struct node * ele){
if((*root)==NULL) {
      (*root) = ele;
    }
    else {
      /* some other code*/
    }
}

和从main打电话应该是 map_tree_put(&r, &ele);

这是关于按值和引用传递的。

这是因为在此代码中:

void map_tree_put(struct node * root, struct node * ele){
    if(root==NULL) {
      root = ele;
    }
    else {
      /* some other code*/
    }
}

该函数接收指针的副本。要使root指针在函数返回时记住重新赋值,您需要这样做:

void map_tree_put(struct node **root, struct node *ele){
  if (root) {
    if(*root==NULL) {
      *root = ele;
    }
    else {
      /* some other code*/
    }
  }
}

最新更新