传递一个未初始化的变量投掷用C

问题描述:

我有这样的代码中的错误:传递一个未初始化的变量投掷用C

 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.我为什么不能过建立(树,0)?它说它是未初始化的,但为什么我会关心它是否未初始化?我直接分配所有需要的内存,所以它会指向新分配的节点。

我该如何解决这个问题?谢谢!!!

+1

'无效的主要()':( – Marlon 2012-07-19 00:04:37

您的node *树未被初始化。

node *tree; 

这很重要,因为代码行

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

分配内存的本地副本。一旦您离开功能范围Build的副本超出范围。内存泄漏。

请记住,一切都是由价值C.

过去了如果你真的想构建分配内存,签名必须是

void Build (node **root , int i) 

,并在该方法的代码会必须参考*root而不是root

+0

,但即使是当地的 - 所以它不应该当我dissapear完成func – user1386966 2012-07-18 23:39:04

+0

确实如此,指针是通过值传递的,这意味着在栈上有一个指针的本地副本......一个指向没有指针的指针你的malloc分配内存到本地(堆栈)副本尝试在调试器中逐步完成。 – 2012-07-18 23:46:38

参数按值传递 - 内存中的位置实际上没有传递。所以当你调用Build时,你只是传入了树的值,这恰好是未初始化的。 Build函数创建一个具有该值的本地根变量 - 当您在Build中设置root = ...时,您将用新值覆盖未定义的值,但是该新值仍然只存在于本地根变量中 - 它从未见过由主变量树变量。

你真正想要做的是有构建返回新创建的树指针:

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

void main() 
{ 
    ... 
    tree = Build(0); 
    ... 
}