2013-03-12 87 views
0

時,我有分段故障分配指針的指針

struct Node{ 
    Node* father; 
    Node* left_son; 
    Node* right_son; 
    char content; 
}; 

void build_tree(Node* node){ 
    Node* left; 
    left->father=node; //segfault 
} 

void init(){ 
    Node* root; 
    build_tree(root); 
} 

我在build_tree()得到段錯誤。爲什麼?

+3

你聽說過operator new嗎? – 2013-03-12 10:55:13

+0

哦,我完全錯過了那一個。在C++中有點生鏽:) – 2013-03-12 10:56:17

+1

你可以請努力閱讀一本C++書籍。 – 2013-03-12 11:01:15

回答

4
Node* left; 

只是聲明瞭一個指針。沒有其他的。沒有Node對象。指針可以指向一個Node對象,但它不會自動給你一個。實際上,left未初始化,如果未調用未定義的行爲,則無法解除引用。

你需要以某種方式與new分配Node對象,也許是:

Node* left = new Node(); 

但然後確保你不要忘了也delete它。

+0

謝謝你的解釋。 – 2013-03-12 10:56:50

2

您不初始化left,因此它指向一個看似隨機的位置。解引用隨機指針導致未定義的行爲,這經常導致崩潰。

同樣適用於main函數中的root

您需要在使用它們之前分配節點。

+0

謝謝Joachim。 – 2013-03-12 10:57:30

2

在您使用它指向父親之前,bulid_tree()功能中的左側尚未分配有效值。

我不知道build_tree()用於什麼。但爲了解決這個問題,你的代碼改成這樣:

void build_tree(Node* node) 
{ 
    Node * left = (struct Node *)malloc(sizeof(struct Node)); 
    left->father=node;  
} 
1

分段故障時,有試圖訪問一個無效/不正確的內存地址的指令時發生。

在你的函數: 無效build_tree(節點*節點) {

Node* left; 

- 這將創建將不會被初始化爲指向應該存在一些對象的指針。

left->father=node; //segfault 

- 在這裏你試圖訪問該指針已被初始化爲對象的成員,但在現實中的物體dosent存在(沒有新 - 構造函數語句存在),因此訪問是無效訪問導致分段錯誤。

} 

糾正上述情況,作爲SO成員(sftrabbit)的一個以前回答您需要的指針初始化之前添加以下語句:: 節點*左=新節點();

這就是所有。 希望這可以幫助