【问题标题】:Dereferencing double pointer to pass to recursive function取消引用双指针以传递给递归函数
【发布时间】:2019-05-12 21:02:16
【问题描述】:

我有以下递归函数,它应该调用自己通过引用传递指针。 如何取消引用 tmproot->lefttmproot->right 以便将其传递给 tree_input()

typedef struct node_s {

    int value;
    struct node_s *left;
    struct node_s *right;

} node_t;

node_t new_node() {
    node_t *new_node = (node_t*)malloc(sizeof(node_t));
    new_node->left = NULL;
    new_node->right = NULL;
    return *new_node;
}

void tree_input(int value, node_t **tmproot)
{
    if (*tmproot == nullptr) {
        node_t *node = &new_node();
        node->value = value;
    }
    else if (value < (*tmproot)->value) {
        tree_input(value, tmproot->left);
    }
    else if (value >= value) {
        tree_input(value, tmproot->right);
    }
    return;
}

tree_input() 第一次使用tree_input(new_value, &amp;root); 调用 我确定我错过了一个简单的技巧。

【问题讨论】:

  • @Frank 纯 C 代码在 C++ 中编译
  • @nicomp C++ 的答案包括:“看在上帝的份上,不要为此使用malloc()”,C 的答案完全不同,所以区别很重要,我认为这是比其他问题更有可能是一个错误标记的问题。
  • @nicomp 不,纯 C 代码中的很多东西不会编译为 C++。仍然有一个“公共子集”可用于编写有效且在两种语言中具有几乎相同含义的代码,但它排除了许多 C 功能。
  • 为了进一步详细说明@aschepler 所说的,上面的行(node_t*)malloc(sizeof(node_t)); 在C++ 中是未定义的行为,因为它会导致严格的别名冲突(除非它后面跟着一个就地新的)。跨度>
  • 不要强制转换malloc的返回值:stackoverflow.com/questions/605845/…

标签: c pointers reference double-pointer


【解决方案1】:

按要求回答问题:

void tree_input() 将指向指针的指针作为参数,node_s-&gt;left 是指针。因此,您所要做的就是使用操作数的地址获取指向指针的指针。

但是,由于tmproot 是一个指向指针的指针,因此还需要取消引用一次才能使用-&gt; 运算符。

tree_input(value, &(*tmproot)->left);

但是,您还应该知道您的 new_node() 函数以及您如何使用它是非常糟糕的。

现在的设置方式是,您在堆上创建一个新的node_t,将其复制到堆栈上,并将指向该堆栈实例的指针存储在您的树中,该指针立即成为一个悬空指针,而堆分配内存只是泄漏了。

要修复它,函数应该返回node_t*,而不是node_t。其他一切都应该从那里自然流动。

【讨论】:

  • 并移除nullptr,这是c++11的一个特性。 NULL 可以。
  • 在使用操作数的地址时出现以下错误:main.cpp:64:29: error: member reference base type 'node_t *' (aka 'node_s *') is not a structure or union tree_input(value, &amp;tmproot-&gt;left); 如您的示例所示
  • @j.Doe 抱歉,我忘记了 tmproot 首先是一个双指针,所以在使用 -&gt; 运算符之前需要取消引用一次。我修复了代码。
  • 非常感谢!代码现在编译没有错误。但是,我使用双指针的唯一原因是我想更改 root 不仅仅是因为我想在另一个函数中使用它。现在我似乎仍在编辑传递的指针root 的副本tmproot。解决此问题并通过参考进行的方法是什么?
  • @j.Doe 这就是你的函数的作用。当然,new_node() 被破坏可能会导致程序看起来像它的行为方式......
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2019-09-16
  • 2017-10-13
  • 2010-10-02
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多