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

C語言鏈表節點修改失效:Search 函數賦值與比較混淆

     編輯:程式設計綜合問答

在鏈表操作中,查找節點並修改數據是常見需求。本文通過一個完整的學生成績管理系統,分析導致程序運行崩潰的關鍵 Bug:Search 函數中 if (flag = 0) 錯誤使用賦值而非比較,導致查找邏輯失效,進而傳遞空指針給修改函數。

錯誤代碼定位


struct stu* Search(struct stu *headp) {
    struct stu *current = headp;
    char aim[15];
    int flag;
    printf("請輸入要修改數據的學生的學號\n");
    scanf("%s", aim);
    while (current) {
        flag = strcmp(current->num, aim);  // strcmp 相等返回 0
        if (flag = 0) break;               // 錯誤:賦值,恆為假,且 flag 被改為 0
        else current = current->next;
    }
    return current;  // 若未找到,current 為 NULL
}

錯誤後果

  • flag = 0 是賦值表達式,值為 0(假),if 不進入,循環繼續
  • 遍歷完整個鏈表 current 變為 NULL
  • 返回 NULL 給調用者
  • 調用 Correct(&(revise->EngSco), ...) 時解引用空指針 → 段錯誤/程序崩潰

修正方法


if (flag == 0) break;  // 正確:比較運算符 ==

或更簡潔:


if (strcmp(current->num, aim) == 0) break;

完善建議

  1. 增加未找到提示:返回 NULL 時在主函數判斷並報錯
  2. 輸入緩衝區處理:scanf("%s", aim) 可能留下換行符,建議用 fgets 或清理緩衝區
  3. 修改函數簡化:直接傳遞節點指針 void Correct(struct stu* node),內部修改成員,避免 6 個參數傳遞
  4. 內存洩漏檢查:程序退出前應遍歷釋放鏈表內存

總結

C 語言中 = 與 == 的混淆是經典陷阱。編譯器開啟警告(-Wall)可提示「suggest parentheses around assignment used as truth value」,養成閱讀警告的習慣能省去無數調試時間。

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