为什么变量的值不按功能更改?

时间:2020-04-16 21:42:00

标签: c pointers binary-tree

我的函数确实有问题,该函数确实从二叉树中删除了该节点。 这里是代码:

void * remove_node(Node * removed_node) {
    if (removed_node->left == NULL) {
        Node * right_node = removed_node->right; void * node_value = removed_node->value;
        free(removed_node); removed_node = right_node;
        return node_value;
    } else {
        /* here a code for find the node with minimal key in a right subtree */
    }
}

如您所见,已删除的节点将被释放并分配给NULL指针。 另外,我有一个破坏整个树的功能:

int namespace_destructor(Node * root) {
    if (root == NULL) return 0;
    else {
        constant_destructor(root->value); // if the current node is a pointer to existed value don't free it
        if (root->left != NULL) namespace_destructor(root->left);
        if (root->right != NULL) namespace_destructor(root->right);
        free(root);
    }
}

问题出在这里:当我打电话给namespace_destructor时,我遇到了SEGFAULT,因为我已经为删除的节点释放了内存。但为什么?在free(removed_node); removed_node = right_node;这一行,我已经将NULL指针设置为remove_node(在我的情况下,right_node为NULL,因为removed node是树的最后一个节点)。如果我没有释放内存,则变量root始终不等于NULL

这里是Node结构:

typedef struct Node {
    int key;
    void * value;
    struct Node * left;
    struct Node * right;
} Node;

下面是我要调用这两个函数的代码:

    if (returned_value->origin != NULL) remove_node(returned_value->origin);
    namespace_destructor(local_namespace);

谢谢您的关注。

0 个答案:

没有答案