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

C 語言順序棧實現常見錯誤分析:指針初始化順序顛倒導致運行失敗

     編輯:程式設計疑難解答

錯誤代碼片段

// 初始化函數
int InitStack(SqStack &S) {
    S.base = new int[MAX];
    if (!S.base) return 0;
    S.base = S.top;  // 錯誤:將 base 賦值給 top,導致 top 丟失堆內存地址
    S.stacksize = MAX;
    return 1;
}

問題分析

S.base 指向新分配的堆內存起始地址。正確邏輯應令 S.top 指向棧頂(初始等於棧底 S.base)。原代碼反向賦值導致:

  • S.top 保持未初始化的垃圾值。
  • 後續 Push/Pop 判斷 S.top - S.base 邏輯完全失效。
  • 內存洩漏:new int[MAX] 分配的地址被覆蓋,無法 delete[]。

修正代碼

int InitStack(SqStack &S) {
    S.base = new int[MAX];
    if (!S.base) return 0;
    S.top = S.base;  // 正確:棧頂指針指向棧底
    S.stacksize = MAX;
    return 1;
}

舉一反三

  • 所有「指針初始化指向有效內存」操作,目標指針在左,源地址在右。
  • 棧結構中 base 固定不動,top 隨入棧/出棧移動。
  • 建議使用 std::vector 或 std::stack 替代手動內存管理(C++ 環境)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved