目錄
- ?1. 基本用法?
- (1) ?基本數據類型?
- (2) ?變量?
- (3) ?數組?
- (4) ?指針?
- ?2. 特殊用法?
- (1) ?結構體與內存對齊?
- (2) ?動態內存分配?
- (3) ?表達式?
- ?3. 注意事項?
- ?1)sizeof 與 strlen 的區別?:
- ?2)變長數組(VLA)?:
- ?3)不要誤用?:
- ?4. 常見問題示例?
- (1) ?指針與數組的混淆?
- (2) ?結構體內存對齊?
在C語言中,sizeof 是一個? 編譯時運算符?,用于計算變量、數據類型或表達式在 內存中所占的?字節數?。它不是一個函數, 不需要在運行時執行,且 結果是編譯時確定的常量(除非操作數是變長數組,VLA)。
?1. 基本用法?
(1) ?基本數據類型?
printf("int 大小: %zu\n", sizeof(int)); // 通常為4字節(32/64位系統)
printf("char 大小: %zu\n", sizeof(char)); // 固定為1字節
printf("double 大小: %zu\n", sizeof(double)); // 通常為8字節
(2) ?變量?
int a = 10;
double b;
printf("變量a的大小: %zu\n", sizeof(a)); // 等價于 sizeof(int)
printf("變量b的大小: %zu\n", sizeof b); // 括號可省略(僅對變量)
(3) ?數組?
計算整個數組的總字節數:
int arr[10];
printf("數組總大小: %zu\n", sizeof(arr)); // 10 * sizeof(int)
計算數組元素個數:
int len = sizeof(arr) / sizeof(arr[0]); // 10
(4) ?指針?
指針的大小與指向的數據類型無關,僅取決于系統架構:
int *p;
char *str;
printf("指針p的大小: %zu\n", sizeof(p)); // 32位系統為4字節,64位系統為8字節
printf("指針str的大小: %zu\n", sizeof(str)); // 同上
?2. 特殊用法?
(1) ?結構體與內存對齊?
結構體的大小可能因內存對齊規則而大于成員大小的簡單相加:
struct Example {char c; // 1字節(對齊到4字節)int i; // 4字節double d; // 8字節
};
printf("結構體大小: %zu\n", sizeof(struct Example));
// 輸出可能是 1 + 3(填充) +4 +8 = 16字節(對齊到8字節邊界)
(2) ?動態內存分配?
sizeof 無法直接獲取動態分配內存的大小:
int *p = malloc(10 * sizeof(int));
printf("p的大小: %zu\n", sizeof(p)); // 輸出指針的大小(如8字節),而非分配的內存大小!
(3) ?表達式?
計算表達式結果類型的字節數(表達式不會被執行):
int x = 0;
printf("表達式大小: %zu\n", sizeof(x + 3.14)); // 等價于 sizeof(double)
?3. 注意事項?
?1)sizeof 與 strlen 的區別?:
- sizeof 計算內存大小(包括字符串的終止符 \0);
- strlen 計算字符串長度(不包含 \0)。
char str[] = "hello";
printf("sizeof(str): %zu\n", sizeof(str)); // 輸出6(5字符 + \0)
printf("strlen(str): %zu\n", strlen(str)); // 輸出5
?2)變長數組(VLA)?:
C99支持變長數組,此時 sizeof 的結果在運行時計算:
int n = 10;
int vla[n];
printf("VLA大小: %zu\n", sizeof(vla)); // 輸出10 * sizeof(int)
?類型轉換?:
sizeof 的結果類型是 size_t(無符號整數),打印時使用 %zu:printf("size_t大小: %zu\n", sizeof(size_t)); // 通常為8(64位系統)
?3)不要誤用?:
- sizeof(指針) 返回指針的大小,而非指向數據的大小!
- sizeof 無法獲取動態數組或堆內存的實際大小。
?4. 常見問題示例?
(1) ?指針與數組的混淆?
void func(int arr[]) {// arr 退化為指針!printf("函數內數組大小: %zu\n", sizeof(arr)); // 輸出指針大小(如8字節)
}int main() {int arr[10];printf("main中數組大小: %zu\n", sizeof(arr)); // 輸出40(假設int為4字節)func(arr);
}
(2) ?結構體內存對齊?
struct A {char a; // 1字節int b; // 4字節(對齊到4字節邊界)short c; // 2字節(對齊到2字節邊界)
};
// 總大小:1 + 3(填充) +4 +2 +2(填充) = 12字節(對齊到4字節)
printf("struct A大小: %zu\n", sizeof(struct A));
?總結?
?用法? | 示例? | ?說明? |
---|---|---|
基本類型大小 | sizeof(int) | 返回類型的字節數 |
變量大小 | sizeof(a) | 等價于變量類型的 sizeof |
數組總大小 | sizeof(arr) | 數組元素個數 × 單個元素大小 |
指針大小 | sizeof(int*) | 取決于系統架構(4或8字節) |
結構體大小 | sizeof(struct Example) | 考慮內存對齊規則 |
合理使用 sizeof 可以避免硬編碼數據類型大小,增強代碼的可移植性。