【问题标题】:Values vanishing after leaving function [duplicate]离开函数后值消失[重复]
【发布时间】:2019-10-14 16:56:19
【问题描述】:

我正在编写一个插入到树中的函数,并且在插入函数后可以看到(打印)数据,但是当尝试在 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 = xxx 时,您将指针设置为新的内存位置,并且原始树指针保持不变,指向旧的空树

标签: c pointers pass-by-value


【解决方案1】:

问题是,tree 作为参数传递给函数,而 by-status 是 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);

【讨论】:

  • node *tree = NULL; 表示它不是指针吗?
  • @FraserLangton 是的,但是仔细检查一下,你想从被调用的函数中改变什么,指针指向的内存内容,还是指针本身?指针与否,所有函数参数都在 C 中按值传递。
  • @Fraser Langton,回复“node *tree = NULL; 表示它不是指针吗?”,是的,但它不是指向您要修改的指针。你要修改调用者的tree,所以需要传递一个指向调用者的tree的指针。
  • 知道了!感谢您的帮助。
【解决方案2】:

将树初始化为指针

node *tree = NULL;

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

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

当你打电话时

tree = new_node(data);

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

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

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多