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

C語言編程 15 大經典陷阱總結:從宏陷阱到未定義行為

     編輯:關於C語言

常見錯誤分類彙總

1. 註釋嵌套導致代碼失效

a = b; /* 註釋開始
c = d; /* 內層註釋 */  // 外層註釋未結束,c=d 不執行

2. 意外賦值與布爾表達式誤用

if (a = b) c; // 恆真當 b!=0
if (0 < a < 5) c; // C 中無布爾鏈式比較,恆真

3. 宏定義缺陷:運算符優先級與副作用

#define assign(a,b) a=(char)b
assign(x, y>>8) // 展開為 x=(char)y>>8,非預期

#define SQ(y) ((y)*(y)) // 參數與整體均需括號
SQ(i++) // i 自增兩次,結果錯誤

4. 頭文件類型定義不一致

不同 .c 文件包含同一頭文件前定義 BOOL 為 char 或 int,導致結構體布局不同,交互出錯。

5. 函數缺少返回值

int foo(int a) { if (a) return 1; } // a==0 時無返回,未定義行為

6. 位域結構體移植性問題

位域順序、對齊方式取決於編譯器與架構(大小端),不可用於網絡協議或二進制接口。

7. 函數參數求值順序不定

foo(ptr->member, ptr = &buf[0]); // 參數求值順序未規定

8. 缺少大括號導致 else 匹配錯誤

if (...) foo();
else printf("..."); // 單語句
bar(); // 永遠執行,非預期

9. 返回棧上局部數組指針

char* f() { char buf[80]; sprintf(buf, "..."); return buf; } // buf 失效

10. 副作用順序未定義

i / ++i // 結果取決於編譯器

11. 未初始化局部變量

void foo(int a) { BYTE *B; if (a) B=Malloc(a); if (B) *B=a; } // B 可能未初始化

12. 巨集名稱衝突標准庫

#define BUFFSIZE 2048
long foo[BUFSIZ]; // BUFSIZ 為 stdio.h 定義,拼寫錯誤不報錯

13. 八進制字面值陷阱

int nums[] = {010, 014}; // 實為 8、12,非 10、14

14. 有符號 char 比較陷阱

char c = 127; c++; // 變負數
if (c > 127) ... // 永假

15. 標准庫函數參數與緩衝區溢出

scanf("%d %d", a, b); // 缺 &
sprintf(buf, "..."); // 無長度檢查
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved