記錄 C 語言開發中易踩的坑與最佳實踐,涵蓋隱式聲明、sizeof、空指針、內存對齊、動態分配、宏定義、volatile、位域等核心主題。
sizeof(arr) 得陣列總大小;sizeof(ptr) 得指針大小 (4/8 字節)。不能對 sizeof 取地址。malloc/calloc/取地址)。int x = 0;、struct S s = {0};、memset(&s, 0, sizeof(s))。#ifndef _H_FILE_H_ #define _H_FILE_H_ ... #endif#ifdef __cplusplus extern "C" { #endif ... #ifdef __cplusplus } #endifextern int g_var; 聲明。static 限制文件作用域避免衝突。char/short 傳參自動擴展為 int。char -127 → int -127 (符號擴展)。%u 對應 unsigned int,傳入 char -1 會按 32 位無符號解釋輸出巨大數值。short -1 (0xFFFF) → int -1 (0xFFFFFFFF))。| 函數 | 特點 | 初始值 |
|---|---|---|
malloc(n) | 分配 n 字節 | 不確定 (垃圾值) |
calloc(n, size) | 分配 n*size,按位清零 | 全 0 |
realloc(ptr, new_size) | 調整大小,可能移動內存 | 擴展部分不確定 |
釋放後指針置 NULL 防野指針;嚴禁釋放非堆內存 (棧/全局/常量區)。
int a[10]; sizeof(a) = 40 (陣列總大小)
int *p = a; sizeof(p) = 4/8 (指針大小)
void f(int p[]) { sizeof(p) = 4/8 } // 參數退化為指針
#define MACRO() do { ... } while(0)#x;連接符:##a += b 等價 a = a + b 但只求值 a 一次 (對副作用表達式重要)~x 逐位翻轉含符號位;-x 等價 ~x + 1 (補碼)。
typedef union {
unsigned char value;
struct {
unsigned int bit0:1; ... bit7:1;
} bit_field;
} PORT;
// 操作 PORT.bit_field.bit3 = 1; // 單位元寫入
位域順序、對齊、跨平台移植性需謹慎,嵌入式寄存器映射常用。
fstat 獲取文件大小/屬性;ftruncate(fd, len) 截斷/擴展文件\n ↔ \r\n),二進制模式 (rb/wb) 直讀直寫。#pragma pack(n) 或 __attribute__((packed)) 控制。