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

C 語言鏈表字典調試實戰:循環變量未重置導致的內存越界錯誤

     編輯:程式設計綜合問答

錯誤現場還原

代碼嘗試從文件讀取單詞對構建字典鏈表,第二次循環讀取時在 p->le[i] = str[i]; 處崩潰。

核心問題:循環計數器 i、j 未在每行處理前重置

// 錯誤代碼片段
int i, j; // 僅在 main 開頭初始化為 0
while (fgets(str, 100, fp) != NULL) {
    while (str[i] != ' ') { // 第二行時 i 已經是上一行的結束值
        p->le[i] = str[i];  // 直接越界寫入
        i++;
    }
    // ...
}

修正方案:將計數器移入行處理循環內部

while (fgets(str, 100, fp) != NULL) {
    int i = 0, j = 0; // 關鍵:每行重置
    // 解析英文單詞
    while (str[i] != ' ' && str[i] != '\0' && str[i] != '\n') {
        if (i < 29) p->le[i] = str[i]; // 防止緩衝區溢出
        i++;
    }
    p->le[i] = '\0';
    
    // 跳過空格
    while (str[i] == ' ') i++;
    
    // 解析中文翻譯
    while (str[i] != '\n' && str[i] != '\0' && str[i] != '\r') {
        if (j < 129) p->tran[j] = str[i];
        i++; j++;
    }
    p->tran[j] = '\0';
    
    // 插入鏈表邏輯...
}

其他隱藏缺陷與修復

問題風險修復
p = pre->link; pre = p; 邏輯顛倒鏈表斷裂,僅保留最後一個節點用尾插法:pre->next = p; pre = p;
未檢查 malloc 返回值內存不足時解引用空指針每次分配後判空
固定緩衝區 char str[100] 可能截斷長行數據丟失動態分配或增大緩衝區
文件編碼可能為 UTF-8 含 BOM首行讀取異常跳過 BOM 或用 fopen(..., "r, ccs=UTF-8")

調試技巧:單步觀察變量值

在 IDE 設置斷點於 while (fgets...) 循環開始,觀察 i、j、str 內容,第二次迭代時即可發現 i 未歸零。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved