初學者常寫 `sizeof(arr)` 期望得到元素個數,實則返回**數組佔用總字節數**。正確長度需除以單個元素大小。
int aaaaa[10];
printf("%d\n", sizeof(aaaaa)); // ❌ 輸出 40 (10 * sizeof(int)=4)
printf("%d\n", sizeof(aaaaa) / sizeof(int)); // ✅ 輸出 10
printf("%zu\n", sizeof(aaaaa) / sizeof(aaaaa[0])); // ✅ 通用寫法,不依賴類型
| 表達式 | 結果 | 說明 |
|---|---|---|
| `sizeof(arr)` | 總字節數 | 僅在數組定義作用域內有效 |
| `sizeof(arr[0])` | 單元素字節數 | 等價於 `sizeof(int)` |
| `sizeof(arr)/sizeof(arr[0])` | 元素個數 | **標準計算長度宏** |
| `sizeof(ptr)` | 指針大小 (4/8) | 指向數組的指針退化後失去長度信息 |
#define ARRAY_LEN(arr) (sizeof(arr) / sizeof((arr)[0]))
// 使用
int a[10];
double b[5];
printf("%zu, %zu\n", ARRAY_LEN(a), ARRAY_LEN(b)); // 10, 5
void foo(int arr[]) {
// ARRAY_LEN(arr) 這裡失效!arr 已退化為指針
// 必須額外傳長度:void foo(int arr[], size_t len)
}