2012-07-18 84 views
0

我有這樣的代碼中的錯誤:傳遞一個未初始化的變量投擲用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

回答

3

您的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

2

參數按值傳遞 - 內存中的位置實際上沒有傳遞。所以當你調用Build時,你只是傳入了樹的值,這恰好是未初始化的。 Build函數創建一個具有該值的本地根變量 - 當您在Build中設置root = ...時,您將用新值覆蓋未定義的值,但是該新值仍然只存在於本地根變量中 - 它從未見過由主變量樹變量。

你真正想要做的是有構建返回新創建的樹指針:

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

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