核心結論
C 語言數組不記錄長度信息,編譯器僅分配連續內存。對於 `int a[10];`,若未填滿,無法直接知道有效元素個數。
常見解決方案
- 哨兵值法:初始化數組為特殊值(如 `INT_MIN`、`0xFFFFFFFF` 或業務上不可能出現的值),遍歷統計非哨兵值個數。缺點:數據範圍不可包含哨兵值。
- 結構體封裝:定義結構體同時存儲數組與當前長度:
typedef struct {
int data[10];
size_t len;
} IntArray;
這是工程實踐中最推薦的方式。
- 動態分配 + 長度變量:使用 `malloc` 分配內存,額外維護 `size` 變量。
- 標準庫替代:C++ 直接用 `std::vector`,C 可參考開源動態數組實現(如 `stb_ds.h`)。
避坑指南
- 切勿嘗試用 `sizeof(a)/sizeof(a[0])` 獲取有效長度,它永遠返回編譯期定義的容量(此處為 10)。
- 字符串(`char[]`)例外:以 `\0` 結尾,可用 `strlen` 獲取有效長度。
C 語言數組無長度信息,哨兵值法、結構體封裝長度、動態數組最佳實踐。