0

我有这个代码:

        typedef struct node
    {
        int data;
        struct node *left;
        struct node *right;
} node;

void Build (node *root , int i)
{
        if (i < 7)
    {
        root = (node *)malloc (sizeof(node));
        root->data = i;
        Build(root->left,2*i+1);
        Build(root->right,2*i+2);
    }
    else
        root = NULL;
}
void Print (node *root)
{
    if (root)
    {
        printf ("%d  ",root->data);
        Print(root->left);
        Print(root->right);
    }
}
void main()
{
    node *tree;

    Build(tree,0);
    Print(tree);
}

我不明白的两件事,1.为什么我不能通过 Build(tree,0) ?它说它未初始化,但为什么我要关心它是否未初始化?我将立即分配所有需要的内存,因此它将指向新分配的节点。

如何修复此代码?谢谢你!!!

4

2 回答 2

3

您的node *to 树未初始化。

node *tree;

这很重要,因为代码行

root = (node *)malloc (sizeof(node));

将内存分配给root本地副本一旦您离开Build的功能范围, root的副本就会超出范围。内存泄漏。

请记住,C 中的所有内容都是按值传递的。

如果您真的希望Build分配内存,则签名必须是

void Build (node **root , int i)

并且您在该方法中的代码必须引用*root而不是root.

于 2012-07-18T23:30:49.720 回答
2

参数是按值传递的——实际上并没有传递内存中的位置。因此,当您调用 Build 时,您只是传入了 tree 的值,而该值恰好是未初始化的。Build 函数使用该值创建一个局部根变量 - 当您root = ...在 Build 中设置时,您将用新值覆盖该未定义值,但该新值仍然只是在局部根变量中 - 它从未被main 中的树变量。

你真正想做的是让 Build 返回新创建的树指针:

node * Build(int i)
{
    node *root;
    ...
        root->left = Build(2*i+1)
    ...
    return root;
}

void main() 
{
    ...
    tree = Build(0);
    ...
}
于 2012-07-18T23:42:35.190 回答