首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 二叉樹程式「無錯誤但停止運作」:未初始化指標導致未定義行為

     編輯:程式設計綜合問答

錯誤程式碼片段

int main() {
    BiTree *T;
    cout << "創建二叉樹" << endl;
    BiTree* creattree();  // 錯誤:這是函式宣告,非呼叫!
    cout << "先序遍歷:"; preOrder(T);  // T 未初始化,野指標
    ...
}

根本原因

BiTree* creattree(); 被誤寫為函式宣告(function declaration),而非函式呼叫。導致 T 保持未初始化狀態,後續遍歷存取野指標觸發存取違規(Access Violation),程式直接崩潰而無編譯錯誤。

正確寫法

int main() {
    BiTree *T = NULL;
    cout << "創建二叉樹" << endl;
    T = creattree();  // 正確:呼叫函式並接收回傳指標
    if (T) {
        cout << "先序遍歷:"; preOrder(T); cout << endl;
        cout << "中序遍歷:"; inOrder(T); cout << endl;
        cout << "後序遍歷:"; postOrder(T); cout << endl;
        cout << "葉子節點為:"; TreeLeaf(T); cout << endl;
        cout << "樹的深度:" << PostTreeDepth(T) << endl;
    }
    return 0;
}

其他潛在問題

  • inOrder、postOrder 錯誤呼叫 preOrder 而非自我遞迴
  • TreeLeaf 使用全域變數 LeafNum 非執行緒安全,建議改為回傳值
  • 記憶體洩漏:程式結束前未釋放樹節點記憶體

除錯建議

  1. 編譯器開啟警告 -Wall -Wextra 可捕捉「函式宣告被誤用」警告
  2. 使用 AddressSanitizer -fsanitize=address 偵測記憶體錯誤
  3. 善用除錯器(GDB/LLDB/Visual Studio)設定中斷點觀察指標值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved