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

C語言 printf 格式化字串參數不匹配導致存取違規錯誤解析

     編輯:程式設計綜合問答

問題背景

在 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)可捕獲此類問題,請務必開啟並重視警告。
  • 使用靜態分析工具(Cppcheck、Clang Static Analyzer)掃描格式化字串不匹配。
  • 考慮使用類型安全的輸出方式(如 C++ iostream 或 fmt 庫)避免此類錯誤。

原始代碼鏈接:codepad.org/UuPofNQA

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