2016-07-30 66 views
0

我正在寫一個應該演示如何樹工作的二進制程序,它有點像20層的問題,但它在最後增加了新的問題,等等。EXC_BAD_ACCESS二叉樹構造

我有最它的代碼將會被編譯,但是當我嘗試執行它時,它給了我錯誤「EXC_BAD_ACCESS」(在Xcode中)。

下面是從我的main.cpp的摘錄初始化樹:

std::string firstSubjectGuess = "rabbit"; 
tree guessTree(firstSubjectGuess); 

我的頭文件中創建的節點結構,並宣佈構造/析構的頂部:

struct node 
{ 
    std::string question; 
    std::string subject; 
    node *yes = NULL; 
    node *no = NULL; 
}; 

class tree 
{ 
public: 
    //tree(); 
    tree(std::string subject); 
    ~tree(); 

然後樹類的構造函數:

tree::tree(std::string subject){ 
    node* root; 
    root->yes = NULL; 
    root->no = NULL; 
    root->question = "Are you thinking of " + getAOrAn(subject[0]) + " " + subject + "?"; 
    root->subject = subject; 
    this->root = root; 
    cursor = root; 
} 

在當前狀態下,我得到在線的錯誤

root->subject = subject; 

在類文件中。但是,如果我改變main.cpp中採取串,而不是直接的變量

(IE

tree guessTree("rabbit"); 

)我在該行得到的錯誤

root->yes = NULL; 

我希望這是一些簡單的東西,我只是俯視,因爲這是通常的情況。

+1

您的構造函數調用*未定義的行爲*。 'root'是不確定的。它從來沒有被授予一個有效的節點地址,但你可以反覆引用它。不相關的,我強烈建議不要將本地自動變量命名爲成員。是的,你可以,但這並不意味着你*應該*。 – WhozCraig

+0

感謝您的提示。我將確保切換這些變量的命名。 – link270

回答

2
node *root; 

你聲明瞭這個指針,但忘了用new實際初始化它。

每個自我尊重的C++編譯器都會大聲警告您使用未初始化的變量。如果您收到編譯器的警告,嘗試編譯時請將其作爲學習體驗:不要忽略編譯器的警告。編譯代碼時唯一應該得到的結果是:什麼都沒有。只有生成的目標文件。

你的編譯器顯然不能捕捉到你的代碼中的每個邏輯錯誤,但它可以捕捉到一些明顯的錯誤。如果您沒有收到編譯器的警告,請閱讀其文檔並找出哪些編譯器選項會打開警告消息。

+0

就像我想的那樣,我覺得很愚蠢的事情可以忽略。謝謝你的好回答!我的編譯器沒有發出警告,否則我肯定會發現它。我一定會聽取您的建議並進行調查,看看是否有一些選擇可以改變,以便更寬鬆地顯示警告。注意:我通過聲明root來解決這個問題。節點* root =新節點; – link270