首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言 sizeof 運算符詳解:類型大小檢測、數組長度計算與 size_t 類型

     編輯:關於C語言

sizeof 核心特性

  • 編譯期運算符(非常量表達式除外),非函數,不計算表達式值(不求值操作數)。
  • 返回類型為 size_t(無符號整數),定義於 <stddef.h>、<stdio.h> 等。
  • 可作用於類型名(需括號)或表達式/變量(括號可選)。

基本類型大小檢測


#include 
#include 

int main() {
    size_t sz;
    sz = sizeof(char);           printf("%zu: char\n", sz);
    sz = sizeof(unsigned char);  printf("%zu: unsigned char\n", sz);
    sz = sizeof(short);          printf("%zu: short\n", sz);
    sz = sizeof(int);            printf("%zu: int\n", sz);
    sz = sizeof(long);           printf("%zu: long\n", sz);
    sz = sizeof(long long);      printf("%zu: long long\n", sz);
    sz = sizeof(float);          printf("%zu: float\n", sz);
    sz = sizeof(double);         printf("%zu: double\n", sz);
    sz = sizeof(long double);    printf("%zu: long double\n", sz);
    sz = sizeof(wchar_t);        printf("%zu: wchar_t\n", sz);
    // 注意:實際大小隨平台/編譯器/模式(32/64位)變化
}

典型 64 位 Linux (LP64) 結果:char=1, short=2, int=4, long=8, pointer=8。Windows 64 位 (LLP64):long=4, long long=8, pointer=8。

作用於變量 vs 類型


int i; double d;
printf("%zu, %zu\n", sizeof(i), sizeof(int));   // 等價
printf("%zu, %zu\n", sizeof(d), sizeof(double)); // 等價
printf("%zu\n", sizeof i);  // 變量可省略括號
printf("%zu\n", sizeof d);

數組與 sizeof 的特殊關係

數組變量:返回整個數組大小(位元組數)


int nums[10];
printf("%zu\n", sizeof nums);        // 40 (10 * sizeof(int))
printf("%zu\n", sizeof nums / sizeof(int));  // 10 (元素個數)

這與 Delphi 等語言 SizeOf 返回元素個數不同,C 返回總位元組數。

數組參數退化:sizeof 返回指標大小


void func(int arr[10]) {
    printf("%zu\n", sizeof(arr));  // 8 (64位指標大小),非 40!
}

函數參數中數組退化為指標,sizeof 失去數組長度信息。

動態分配記憶體:sizeof 指標 ≠ 分配大小


int *p = malloc(100 * sizeof(int));
printf("%zu\n", sizeof(p));  // 8 (指標大小),無法獲取 400
// 必須自行記錄分配大小

結構體與對齊


struct A { char c; int i; };
printf("%zu\n", sizeof(struct A));  // 通常 8 (含 3 字節填充)

sizeof 返回含對齊填充的總大小,而非成員大小之和。

避坑指南

  1. 返回類型用 size_t 而非 int:64 位系統 size_t 為 64 位,int 可能截斷。
  2. 打印用 %zu (C99) 或 %lu + 強轉:printf("%zu", sizeof(x))。
  3. 不要對有副作用的表達式用 sizeof:sizeof(i++) 不會執行 i++(不求值)。
  4. VLA (變長數組) 例外:sizeof(arr) 其中 arr 為 VLA 會在運行期計算並求值其長度表達式。

實用技巧:編譯期斷言


#define STATIC_ASSERT(cond) sizeof(char[1 - 2*!(cond)])
STATIC_ASSERT(sizeof(int) == 4);  // 失敗導致編譯錯誤:負數組大小

總結

sizeof 是 C 語言靜態類型系統的鏡像,提供類型/對象大小的編譯期常量。掌握其對數組、指標、結構體、VLA 的不同行為,配合 size_t 與 %zu 正確使用,是編寫可移植、無警告 C 代碼的基礎技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved