2015-05-13 88 views
0
#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; 
} 

我寫了一個函數來在二叉樹的根中插入一個值。在我的插入函數中,我分配了一個臨時節點,並且在將值插入到臨時節點後,我將臨時節點分配給了根節點並釋放臨時節點。我知道我可以直接將malloc放入根變量並將數據分配給它。當free(temp)被調用時會發生什麼,它會如何影響根變量?爲什麼在主函數中root的值被打印爲0?

+0

'root-> data'具有未定義的行爲,因爲'root'是一個無效指針(它指向內存的一個釋放部分)。 –

回答

2

你不應該free()temp,因爲你仍然指向它與root,它們指向同一個數據,從而釋放temp做免費*root了。

至於爲什麼它的打印0這只是一個巧合,因爲有free()root的功能,你分配它,並在main()訪問它調用未定義的行爲,後果可能是printf()版畫,0,這是一個行爲,並且由於它是未定義的,所以其他行爲實際上是可能的。

+0

我不清楚的是,我已經閱讀無處不在,無論你malloc應該是免費的()編輯。使用相同的臨時變量什麼是編寫代碼的正確方法? – EnthusiatForProgramming

+0

@ user1534214你當然需要釋放malloc內存。但只有當你不需要它了。顯然在這種情況下,你仍然需要這樣的記憶,所以你不應該釋放它。通常,當將該節點從樹中刪除/移除時,將釋放內存。 – kaylum

相關問題