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

深入理解 sizeof 與 strlen 的區別

     編輯:關於C語言

核心差異一覽

特性sizeofstrlen
本質編譯期運算符運行期庫函數
單位位元組字符數(不含結束符)
參數類型、變量、表達式以 \0 結尾的 char*
數組參數不退化,得整個數組大小退化為指針,只能算字符串長度
結構體含對齊填充位元組不適用

經典案例解析

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

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

char ss[100] = "0123456789";
sizeof(ss)   // 100 (整個數組大小)
strlen(ss)   // 10

class X { int i; int j; char k; };
sizeof(X)    // 12 (內存對齊填充)

進階陷阱

1. 函數參數退化

void fun(char szPath[MAX_PATH]) {
    sizeof(szPath); // 4/8 (指針),非 MAX_PATH
}

2. 不完全類型限制

sizeof 不能用於:函數類型、位字段、未知大小數組(extern int arr[];)、void 類型。

3. 對齊控制

VC++ 中可用 #pragma pack(n) 或項目屬性調整對齊,影響 sizeof 結果。

最佳實踐

  • 動態分配:malloc(sizeof(T) * n) 代替硬編碼數字。
  • 結構體序列化/網絡傳輸:配合 #pragma pack(1) 確保跨平台一致。
  • 字符串處理:sizeof(buf) 用於緩衝區大小,strlen(str) 用於有效長度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved