解引用双指针以传递给递归函数

时间:2019-05-12 21:02:17

标签: c pointers reference double-pointer

我有以下递归函数,该递归函数应该调用自身以引用方式传递指针。 如何取消引用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, &root); 我确定我错过了一个简单的技巧。

1 个答案:

答案 0 :(得分:2)

要回答以下问题:

void tree_input()将指向该对象的指针作为参数,而node_s->left是一个指针。因此,您要做的就是使用操作数的地址获取指向该指针的指针。

但是,由于tmproot是一个指向指针的指针,因此在使用->运算符之前还需要对其进行一次取消引用。

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

但是,您还应该知道new_node()函数以及如何使用它已经损坏了。

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

要修复此问题,该函数应返回node_t*,而不是node_t。其他一切都应该自然地流向那里。