离开功能后价值消失

时间:2019-05-29 06:38:19

标签: c pointers pass-by-value

我正在编写一个插入到树中的函数,插入该函数后可以看到(打印)数据,但是当试图在主体中看到它时,什么也没发生。

node *tree = NULL;
insert(tree, 4321);
printf("outer: %d\n", tree->data);

void insert(node* tree, int data) {
  if (tree == NULL) {
    tree = new_node(data);
    printf("inner: %d\n", tree->data);
  }
}

这给出了:

inner: 4321

应该是:

inner: 4321
outer: 4321

2 个答案:

答案 0 :(得分:8)

问题在于,tree作为参数传递给函数,并且按状态是C中的传递值。对函数内部tree本身所做的任何更改都会不会反映给呼叫者。

如果要从调用的函数中修改tree,则需要传递指向tree的指针。

类似

void insert(node** tree, int data) {
  if (*tree == NULL) {
    *tree = new_node(data);
    printf("inner: %d\n", (*tree)->data);
  }
}

并称呼它

insert(&tree, 4321);

答案 1 :(得分:1)

您将树初始化为指针

node *tree = NULL;

这意味着,变量的内容是存储树的存储位置。

当您将该内存位置传递给函数时,其值将被复制到函数内部的局部变量中。

致电时

tree = new_node(data);

您正在做的就是为函数内tree指针的局部变量分配一个新的内存位置。函数外部的指针仍然具有相同的值,并且指向没有节点的内存位置。

要在函数内编辑节点,您需要做的是为节点定义某种设置器,或者使用tree->data = xxx显式设置data属性。这将更改存储器tree所指向的内容,而不是更改其存储位置。