在鏈表操作中,查找節點並修改數據是常見需求。本文通過一個完整的學生成績管理系統,分析導致程序運行崩潰的關鍵 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 變為 NULLNULL 給調用者Correct(&(revise->EngSco), ...) 時解引用空指針 → 段錯誤/程序崩潰
if (flag == 0) break; // 正確:比較運算符 ==
或更簡潔:
if (strcmp(current->num, aim) == 0) break;
NULL 時在主函數判斷並報錯scanf("%s", aim) 可能留下換行符,建議用 fgets 或清理緩衝區void Correct(struct stu* node),內部修改成員,避免 6 個參數傳遞C 語言中 = 與 == 的混淆是經典陷阱。編譯器開啟警告(-Wall)可提示「suggest parentheses around assignment used as truth value」,養成閱讀警告的習慣能省去無數調試時間。