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

C語言指標除錯入門:常見錯誤模式與 GDB/VS 除錯技巧

     編輯:C 語言問答

常見指標錯誤模式

錯誤類型典型程式碼現象除錯關鍵
野指標int *p; *p = 10;隨機崩潰/資料損壞觀察 p 是否為 0x0/0xCCCCCCCC/隨機值
釋放後使用free(p); *p = 5;Heap corruption, 雙重 freeValgrind/AddressSanitizer 偵測
越界存取int a[10]; a[10] = 0;靜默資料損壞/崩潰編譯加 -fsanitize=address 或 VS 勾選啟用位址消毒器
雙重釋放free(p); free(p);Heap 鎖死/崩潰釋放後置 NULL: free(p); p=NULL;
棧上位址外洩int* f() { int x; return &x; }呼叫者得到無效位址靜態分析/編譯器警告 -Wreturn-local-addr
const 違規const char *s="abc"; s[0]='x';段錯誤 (寫入唯讀段)編譯器警告 -Wdiscarded-qualifiers

GDB 除錯指標實戰指令


(gdb) print p           # 印指標值 (位址)
(gdb) print *p          # 印指向的值 (解參考)
(gdb) print *(int*)0x7ff... # 任意位址解參考
(gdb) x/10xw p          # 以 16 進位顯示 p 起始 10 個字 (4 bytes)
(gdb) watch *p          # 監視 *p 變化 (硬體斷點)
(gdb) bt                # 堆疊回溯,看崩潰時呼叫鏈

Visual Studio 除錯技巧

  • 監視視窗:輸入 p, *p, p[0]@10 (陣列檢視)。
  • 記憶體視窗:拖曳指標值到記憶體視窗,即時看原始位元組。
  • 資料斷點:新增資料斷點於 *p,寫入時中斷。
  • 位址消毒器:專案屬性 → C/C++ → General → Enable Address Sanitizer (VS 2019+)。

預防勝於治療:指標防禦性程式設計

  1. 宣告即初始化:int *p = NULL; 或 int *p = &var;。
  2. 解參考前檢查:if (p) { ... }。
  3. 擁有權語意:誰 malloc 負責 free,用命名慣例 create_xxx/destroy_xxx。
  4. 用 const 保護只讀資料:void print(const int *arr, size_t n)。
  5. 啟用所有警告:-Wall -Wextra -Wpedantic -Wshadow -Wconversion (GCC/Clang) 或 /W4 (MSVC)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved