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

深入理解 sizeof 與 strlen:編譯期與執行期的本質區別

     編輯:關於C語言

核心差異一覽

特性sizeofstrlen
性質編譯期運算子執行期函數
參數型別或運算式(不求值)const char*(必須以 \0 結尾)
回傳型別/物件佔用位元組數(size_t)字串長度(不含結束符)
陣列參數不退化,得知完整大小退化為指標,只能算長度
動態記憶體只能得知指標大小正常運作

經典範例解析

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

char ss[] = "0123456789";
sizeof(ss)      // 11(含結束符)
strlen(ss)      // 10

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

int arr[100];
sizeof(arr)     // 400(100 * sizeof(int))
// strlen(arr)  // 編譯錯誤:參數型別不符

進階規則

  1. sizeof 可用於函數呼叫運算式:sizeof(f()) 等於 sizeof(回傳型別),不會呼叫函數。
  2. 結構體 sizeof 受對齊影響,參考 #pragma pack 或 __attribute__((packed))。
  3. 函數參數為陣列時(void fun(char s[20])),實際退化為指標,sizeof(s) 為指標大小。
  4. sizeof 不可用於:函數型別、不完全型別(如未知大小陣列 extern int a[];)、位元欄位、void。

常見用途

  • 動態配置:malloc(n * sizeof(T))
  • 記憶體操作:memset(buf, 0, sizeof(buf))(僅限陣列,非指標)
  • 通用資料結構儲存型別大小(如 Windows 結構體的 cbSize 欄位)。
  • 編譯期計算陣列元素數:#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))。

避坑指南

  1. 指標變數永遠不要用 sizeof(ptr) 期望得到指向資料大小。
  2. 函數參數為陣列時,大小必須額外傳遞參數。
  3. 結構體對齊導致 sizeof 大於成員大小總和,屬正常現象。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved