即使将其分配给 NULL (C),指针也不是 NULL

Pointer not NULL even after assigning it to NULL (C)

我正在尝试释放两个二叉搜索树 (BST)。虽然两个 BST 都维护自己的节点,但它们包含的对象与我被告知以不同排序顺序维护两个 BST 的对象相同。这会导致双重释放情况,因为当我释放第二个 BST 时,对象仍然存在。我想之后将指针设置为 NULL,因为释放空指针是安全的。但是根据我的断点,进入第二次free call时指针不为NULL

这是我试图释放两组 BST 的函数。

void freeEmpDatabase(EmpDatabase database) {
    freeTree(database.info->ssn_top);
    freeTree(database.info->id_top);
    free(database.info);
}

这是我释放单个树的函数。

void freeTree(BinaryTree * tree) {
    if (tree != NULL) {
        freeTree(tree->right);
        free(tree->Object);
        freeTree(tree->left);
        tree->Object = NULL;
        free(tree);
    }
}

这是相关的结构。 (这是一项实验前作业,它让我按值传递“数据库”结构,因此传递了 EmpInfo 指针)。

typedef struct BinaryTree {
    void * Object;
    struct BinaryTree * left;
    struct BinaryTree * right;
}BinaryTree;
typedef struct EmpInfo {
    BinaryTree * ssn_top;
    BinaryTree * id_top;
    int size;
    int error;
}EmpInfo;
typedef struct EmpDatabase {
    EmpInfo * info;
}EmpDatabase;

如果有任何帮助,我将不胜感激。谢谢。

正如@Yunnosch 所解释的,尽管它们都指向同一个对象,但指针本身是副本。为了补救我的特定用例,我只是添加了一个布尔值来控制我是否需要释放对象指针:

void freeEmpDatabase(EmpDatabase database) {
    freeTree(database.info->ssn_top, 1);
    freeTree(database.info->id_top, 0);
    free(database.info);
}
void freeTree(BinaryTree * tree, int freedObject) {
    if (tree != NULL) {
        freeTree(tree->right, freedObject);
        if (freedObject == 1) {
            free(tree->Object);
        }
        freeTree(tree->left, freedObject);
        tree->Object = NULL;
        free(tree);
    }
}