离开函数后值消失

Values vanishing after leaving function

我正在编写一个函数来插入到树中,在函数中插入后可以看到(打印)数据,但是当试图在 main 中看到它时没有任何反应。

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

问题是,tree 作为参数传递给函数,而 by-status 在 C 中是 pass-by-value。对 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);

你将树初始化为一个指针

node *tree = NULL;

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

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

当你打电话时

tree = new_node(data);

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

要在函数内编辑节点,您需要做的是为节点定义某种 setter,或者使用 [=13] 显式设置数据 属性 =].这将改变 tree 指向的内存内容,而不是改变其内存位置。