在 C 語言開發中,printf 格式化字串與實際參數數量不匹配是常見且隱蔽的錯誤。本文分析一個典型案例:程式在執行到 printf 時拋出 0xC0000005 存取違規異常,錯誤位置指向 msvcr100d.dll。
printf("%s\t《%s》\t%s\t%s\t%d冊\t%s元",
L->data[i].isbn,
L->data[i].name,
L->data[i].writer,
L->data[i].producter,
L->data[i].num,
L->data[i].price);
格式化字串包含 6 個佔位符(%s×4、%d、%s),但實際傳遞的參數僅有 5 個。缺少 writer(作者)參數,導致 printf 繼續從堆疊讀取下一個不存在的參數,造成指標越界,觸發存取違規。
補上缺少的參數,確保格式化字串與參數一一對應:
printf("%s\t《%s》\t%s\t%s\t%d冊\t%s元",
L->data[i].isbn,
L->data[i].name,
L->data[i].writer, // 新增作者參數
L->data[i].producter,
L->data[i].num,
L->data[i].price);
-Wformat)可捕獲此類問題,請務必開啟並重視警告。iostream 或 fmt 庫)避免此類錯誤。原始代碼鏈接:codepad.org/UuPofNQA