2014-11-21 57 views
-1

我的任務是在C/C++中編寫更簡單的編譯器。 main()函數調用下面的函數parse_program()以讀取控制檯的所有輸入並將其存儲在鏈接列表圖中。爲什麼在使用指針(C++)時會出現未初始化的堆內存錯誤?

出於某種原因,我的程序違反此:

while (node != NULL){ 
    if (node->id == ID) //Breaks here 
     ...; 
    node = node->next; 
} 

隨着內存訪問衝突在0xCDCDCDCD。對此的研究表明我有未初始化的堆內存。稍做實驗後,我意識到在創建節點後,立即在位置0xCDCDCDCD處選擇node-> next。

struct Node* parse_program(){ 
    struct Node* node = new Node; 
    cout << node; 
    cout << node->next; 

    ...; 
    return node; 
} 

輸出

0044A940 
CDCDCDCD 

上述功能是在程序中調用的第一件事。我確實有全局變量。

我是否爲節點分配內存不正確?即使在調用數組/指針之前,單元化數組/指針或程序中其他地方的某個東西是否會導致錯誤?

感謝您的任何建議。我很難從哪裏開始尋找問題。

+5

你正確地分配了節點 - 你期望node-> next point,你沒有把它設置爲任何東西,所以它包含垃圾。 – pm100 2014-11-21 00:45:22

+3

Node的構造函數是什麼樣的? – razeh 2014-11-21 00:46:25

回答

3

這裏是選擇我知道如何解決它:

  • 您可以手動在node = new Node;後立即設置node->next = NULL;;
  • 您可以使用new Node()用括號如果Node沒有任何用戶提供的構造函數(如struct Node { Node *next; };)查看有關值初始化這裏更多的細節:http://en.cppreference.com/w/cpp/language/value_initialization
  • 您可能需要一個默認的構造函數添加到節點,使自動初始化next

這裏是如何添加一個構造函數:

struct Node { 
    Node() : next(NULL) {} 
    Node *next; 
    ... 
}; 

new Node將調用默認的構造函數Node(),這將next數據成員設置爲NULL你。

如果省略了構造函數,C++將使用與new Node,這使next未初始化(其值未定義)隱含Node() {},所以當你打印出來,你會得到隨機的垃圾。

+1

其實沒有。最好離開這些幫助結構集合。如果需要使用聚合初始化。 – Deduplicator 2014-11-21 00:49:18

+1

@Deduplicator:這是一個意見問題,有什麼更好的。我添加了一個替代我的答案。 – pts 2014-11-21 00:52:15

+0

@Deduplicator:我仔細檢查了我答案的最後一句,我認爲這是正確的。我不明白你認爲它是錯誤的。我認爲下面的語句是錯誤的:'struct Node {Node * next; };','new Node'將'next'設置爲'NULL'。 – pts 2014-11-21 00:59:05

相關問題