C 語言中 sizeof 是編譯期運算符,返回類型或表達式佔用的內存字節數。初學者極易混淆「數組大小(字節數)」與「元素個數」,導致邏輯錯誤。本文通過三種類型數組對比、strlen 干擾項分析,徹底釐清兩者關係與計算方法。
| 概念 | 含義 | 計算方法 |
|---|---|---|
| 數組大小 | 數組佔用的總內存字節數 | sizeof(array) |
| 元素個數 | 數組中元素的數量 | sizeof(array) / sizeof(array[0]) |
#include#include #define SIZE 7 typedef struct Person { int age; char *name; char flag; } Person_t; int main() { int array1[SIZE]; // int 數組 char array2[SIZE]; // char 數組 Person_t array3[SIZE]; // 結構體數組 printf("int 數組: 大小=%zu, 元素個數=%zu\n", sizeof(array1), sizeof(array1)/sizeof(int)); printf("char 數組: 大小=%zu, 元素個數=%zu\n", sizeof(array2), sizeof(array2)/sizeof(char)); // 陷阱:char 數組作字符串時 strlen 返回字符長度(不含 \0) printf("char 數組 strlen: %zu\n", strlen(array2)); // 未初始化,結果不定 printf("結構體數組: 大小=%zu, 元素個數=%zu\n", sizeof(array3), sizeof(array3)/sizeof(Person_t)); return 0; }
int 數組: 大小=28, 元素個數=7 char 數組: 大小=7, 元素個數=7 char 數組 strlen: 7 結構體數組: 大小=84, 元素個數=7
SIZE=7 指定。strlen 返回有效字符長度(遇 \0 停止),不等於 數組大小或元素個數(除非滿存無 \0)。void print_size(int arr[]) { // 等價 int *arr
printf("函數內 sizeof(arr)=%zu\n", sizeof(arr)); // 輸出 8 (64位指針大小)
}
int main() {
int a[10];
printf("主函數 sizeof(a)=%zu\n", sizeof(a)); // 輸出 40
print_size(a);
return 0;
}
對策:函數接收數組時,必須額外傳遞長度參數,或使用結構體封裝 {int *data; size_t len;}。
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
// 使用
int a[10];
printf("元素個數: %zu\n", ARRAY_SIZE(a)); // 10
// ARRAY_SIZE(ptr) 會編譯報警/產生錯誤結果,可配合 _Static_assert 防誤用
sizeof(array) = 數組大小(字節),編譯期常量。sizeof(array) / sizeof(element_type),只在數組定義可見的作用域內有效。char 數組若作字符串,strlen ≠ 數組大小 ≠ 元素個數,三者完全不同。sizeof 失效,必須顯式傳長度。牢記:「sizeof 看字節,除以單元素得個數;指針不是數組,傳長避免坑」。