为什么root的值在main函数中打印为0?

时间:2015-05-13 00:48:10

标签: c pointers malloc free

#include <stdio.h> 
#include <stdlib.h> 

struct nodeTree { 
    int data; 
    struct nodeTree* left; 
    struct nodeTree* right; 
};

struct nodeTree* insertRoot(struct nodeTree** root, int data) { 
    if(!(*root)) { 
        struct nodeTree *temp = malloc(sizeof(struct nodeTree));
        if(!temp) {
            exit(-1);
    } 

        temp->data = data; 
        temp->left = 0; 
        temp->right = 0; 
        (*root) = temp; 
        free(temp); 
        return *root;
    }
}



 int main() { 
    struct nodeTree *root = NULL; 
    root = insertRoot(&root,10);
    printf("%d\n",root->data);
    return 0;
}

我写了一个函数来在二叉树的根中插入一个值。在我的插入函数中,我分配了一个临时节点,在将值插入临时节点后,我将临时节点分配给root并释放临时节点。我知道我可以直接malloc到根变量并将数据分配给它。调用free(temp)时会发生什么?它如何影响根变量?

1 个答案:

答案 0 :(得分:2)

您不应该free() temp,因为您仍然指向root,它们指向相同的数据,因此释放temp免费{{1}也是。

至于为什么打印*root这只是一个巧合,因为在您分配它的函数中有0 ed free()并且访问它在root中调用未定义的行为,结果可能是main()打印,printf(),这是一种行为,并且由于它未定义,所以任何其他行为实际上都是可能的。 / p>