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

深入理解 sizeof:核心語意、與 strlen 差異、對齊陷阱與實戰用例

     編輯:關於C++

sizeof vs strlen:根本區別

特性sizeofstrlen
性質編譯期運算子執行期函式
單位位元組字元數(不含結尾 \\0)
參數型別或運算式(變數/陣列/結構)以 \\0 結尾的 char*
陣列參數不退化,得整個陣列大小退化為指標,僅得指標大小
動態陣列無法得知大小(得指標大小)正常運作

經典範例速查


char* ss = "0123456789";
sizeof(ss)     // 4 (指標大小)
sizeof(*ss)    // 1 (char)

char ss[] = "0123456789";
sizeof(ss)     // 11 (含結尾 \\0)
strlen(ss)     // 10

char ss[100] = "0123456789";
sizeof(ss)     // 100 (陣列宣告大小)
strlen(ss)     // 10

int ss[100] = {0};
sizeof(ss)     // 400 (100 * sizeof(int))
strlen(ss)     // 編譯錯誤:參數必須是 char*

核心規則深度解析

  1. 結果型別:size_t(unsigned int 別名),保證容納最大物件位元組數。
  2. 運算子而非函式:sizeof(type) 需括號,sizeof var 可省略括號。
  3. 可用於函式呼叫:sizeof(f()) 等於 sizeof(回傳型別),不會真正呼叫函式。
  4. 陣列不退化:這是 sizeof 能計算陣列維度的關鍵(sizeof(arr)/sizeof(arr[0]))。
  5. 編譯期計算:可用於定義陣列大小 char buf[sizeof(struct)]。
  6. 結構對齊影響:

class X { int i; int j; char k; };  // 4+4+1 = 9,但對齊至 12
X x;
sizeof(X)  // 12
sizeof(x)  // 12

對齊單位通常為 4 或 8 位元組(VC++ 可用 #pragma pack(n) 或專案設定調整)。

函式參數陷阱


void fun(char szPath[MAX_PATH])  // 等價於 void fun(char* szPath)
{
    sizeof(szPath);  // 4 (指標大小),非 MAX_PATH!
}

解決方案:額外傳遞長度參數,或在函式內 memcpy 複製到本地陣列。

sizeof 不能用於的類型

  • 函式型別(sizeof(void()) 錯誤)
  • 不完全型別:未知大小陣列(extern int arr[])、未定義結構/聯集、void
  • 位元欄位

實戰應用場景

  1. 記憶體配置:malloc(sizeof(MyStruct))、new char[sizeof(Buffer)]
  2. I/O 操作:fread(buf, sizeof(buf), 1, fp)、write(fd, &obj, sizeof(obj))
  3. 記憶體操作:memset(&obj, 0, sizeof(obj))、memcpy(dst, src, sizeof(src))
  4. 結構版本控制:Windows API 結構常含 dwSize = sizeof(STRUCT) 欄位,便於版本相容。
  5. 避免魔術數字:send(sock, buf, sizeof(buf), 0) 優於硬編碼長度。

總結口訣

  • sizeof:編譯期、型別/物件佔用位元組、陣列不退化、結構含對齊填充。
  • strlen:執行期、字串邏輯長度、需 \\0 結尾、僅適用 char*。
  • 函式參數陣列退化為指標,sizeof 失效,需額外傳長度。
  • 善用 sizeof 消除魔術數字,提升可維護性與移植性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved