在C中重新分配void指针

时间:2019-04-26 03:45:23

标签: c void-pointers

我正在制作Binary Tree是C。我知道如何制作Binary Tree,这不是这里的问题。

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

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

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

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

代表二叉树的所有元素。

public function scopePublished($query)
{
return $query->where('published_at', '<=', Carbon::now());
}

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

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*/
    }

}

2 个答案:

答案 0 :(得分:1)

尝试

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

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

答案 1 :(得分:1)

那是因为在这段代码中:

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*/
    }
  }
}