C語言雖強大,但隱藏的“坑”也不少!稍不留神就會導致程序崩潰、數據異常。本文整理15個高頻陷阱,助你寫出更穩健的代碼!
陷阱1:運算符優先級混淆
問題:運算符優先級不同可能導致計算順序錯誤。
int a = 5, b = 3;
int c = a++ * --b; // a=6, b=2, c=10
若寫成 ++a * b--,結果會變為 c=18(a=6, b=2)。
解決:
熟記優先級表,或用括號明確順序:
int c = (a++) * (--b);
陷阱2:變量名大小寫敏感
問題:myVar和 MyVar會被視為不同變量。
int MyVar = 5;
int myvar = 3;
printf("%d", MyVar + myvar); // 輸出8
解決:
統一命名風格(如全小寫+下劃線),避免混淆。
陷阱3:數組越界訪問
問題:訪問不存在的下標導致崩潰或數據污染。
int arr[3] = {1,2,3};
int x = arr[3]; // 越界!
解決:
牢記數組下標范圍是 0到長度-1。
陷阱4:整型溢出
問題:數值超出類型范圍會“循環”取值。
unsigned char x = 255;
x += 1; // x=0
解決:
預估數值范圍,選用 `int32_t`、`uint64_t` 等合適類型。
陷阱5:空指針解引用
問題:未初始化指針直接使用導致崩潰。
int *p = NULL;
*p = 5; // 致命錯誤!
解決:
使用前檢查指針有效性:
if (p != NULL) *p = 5;
陷阱6:隨機數種子未設置
問題:rand()默認種子固定,導致隨機序列重復。
for (int i=0; i<10; i++) { ?
printf("%d ", rand()); // 每次輸出相同序列
}
解決:
用 srand(time(NULL))`初始化種子。
陷阱7:字符串未正確終止
問題:忘記添加 `` 導致字符串異常。
char str[10] = "hello";
str[5] = 'w'; // 覆蓋了原結尾的
printf("%s", str); // 輸出亂碼
解決:
手動補 ``:
str[5] = 'w';
str[6] = '';
陷阱8:死循環
問題:循環條件錯誤導致無限執行。
int i=0;
while (i < 10) { ?
printf("%d ", i);
} // i未自增,死循環!
解決:
檢查循環變量是否更新,或用 `for` 替代。
陷阱9:變量作用域錯誤
問題:在作用域外訪問變量。
if (x == 1) {
int y = 2;
}
printf("%d", y); // 編譯錯誤!
解決:
理解作用域規則,必要時將變量聲明在外部。
陷阱10:隱式類型轉換
問題:未顯式轉換導致結果錯誤。
int a = 5;
double b = 2.0;
printf("%f", a / b); // 正確寫法:(double)a / b
解決:
手動強制轉換類型,避免隱式轉換歧義。
陷阱11:函數參數不匹配
問題:參數數量或類型錯誤導致編譯失敗。
int add(int a, int b);
printf("%d", add(1,2,3)); // 參數過多!
解決:
嚴格匹配函數聲明與調用參數。
---
陷阱12:空結構體指針訪問
問題:未初始化指針訪問成員導致崩潰。
struct Person *p = NULL;
printf("%s", p->name); // 訪問空指針!
解決:
檢查指針是否有效后再操作。
陷阱13:文件未正確關閉
問題:未處理 `fopen` 失敗或忘記 `fclose`。
FILE *fp = fopen("test.txt", "r");
// 未檢查fp是否為NULL
fclose(fp); // 若fp為NULL,程序崩潰
解決:
始終檢查文件指針,并確保關閉:
if (fp != NULL) fclose(fp);
陷阱14:宏定義未加括號
問題:宏展開后運算順序錯誤。
#define SQUARE(x) x*x
int b = SQUARE(a+1); // 展開為a+1*a+1=2a+1
解決:
宏參數用括號包裹:
#define SQUARE(x) (x)*(x)
陷阱15:多線程未同步
問題:多線程競爭導致數據錯亂。
// 兩個線程同時調用printf可能輸出亂序
pthread_create(&t1, NULL, print_msg, "Thread1");
pthread_create(&t2, NULL, print_msg, "Thread2");
解決:
使用互斥鎖(mutex)或信號量同步線程。
總結:C語言陷阱雖多,但通過規范編碼、充分測試和工具檢查(如靜態分析工具),可大幅降低風險。建議收藏本文,編碼時多自查!
審核編輯 黃宇
-
C語言
+關注
關注
180文章
7630瀏覽量
140252
發布評論請先 登錄
EMC 設計避坑指南:四不口訣

EMC 設計避坑指南:四不口訣

揭秘Air780EPM開發陷阱:20個避坑指南與最佳解決方案

內網穿透避坑指南 6 大常見錯誤 + 保姆級解決方案!
選購高精度貼片機必看!5大核心關注點與避坑指南

工程師避坑指南:減少PCBA返工的實用經驗
嵌入式開發避坑指南|FreeRTOS的5個\"反直覺\"小技巧
MOS管選型十大陷阱:參數誤讀引發的血淚教訓MDD

電子小白必看!單片機、MPU、MCU 區別與選芯避坑指南

評論