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

C 語言 sizeof 與 strlen 核心區別深度解析

     編輯:關於C語言

本質區別一覽

特性sizeofstrlen
性質運算符 (C++ 關鍵字)運行期庫函數
計算時機編譯期 (大多數情況)運行期
參數類型類型或表達式僅 char* (以 '\0' 結尾)
返回值類型/對象佔用位元組數字符串有效字符長度 (不含 '\0')
返回類型size_t (unsigned int)size_t
陣列參數不退化,得整個陣列大小退化為指標,得字符串長度
括號規則類型須加括號,變數可不加函數調用必須加括號

經典對比案例

char str[20] = "0123456789";  // 10 個字符 + '\0',佔 11 位元組,陣列大小 20

int a = strlen(str);  // a = 10 (字符串長度)
int b = sizeof(str);  // b = 20 (陣列總大小,含未使用空間)

進階場景解析

1. 函數參數傳遞時的退化

void fun(char arr[8])  // 等價於 void fun(char *arr)
void fun(char arr[])   // 等價於 void fun(char *arr)
void fun(char *arr)    // 本質相同

函數內 sizeof(arr) 返回指標大小 (4/8 位元組),無法獲知陣列長度。

解決方案

  • 額外傳遞長度參數:fun(unsigned char *p, int len)
  • 結構體封裝:struct { int len; char *data; }
  • C++ 使用 std::vector、std::string、std::span (C++20)

2. 指標與陣列的 sizeof 差異

char *ss = "0123456789";
sizeof(ss);      // 4/8 (指標大小)
sizeof(*ss);     // 1 (char 大小)
strlen(ss);      // 10 (字符串長度)

3. 結構體與靜態陣列

  • sizeof(struct):返回實際大小 (含對齊填充)
  • sizeof(static_array):返回整個陣列大小
  • sizeof 無法 獲取動態分配記憶體 (malloc) 或外部陣列 (extern) 大小

4. sizeof 作用於函數調用

short f();
printf("%zu\n", sizeof(f()));  // 輸出 2 (sizeof(short)),f() 不會被調用

關鍵:sizeof 運算元表達式不求值,僅推導類型。

常見錯誤與避坑

錯誤代碼問題正確做法
sizeof("abc") 以為是 3字符串常量含 '\0',大小為 4字符串長度用 strlen,大小用 sizeof
函數內用 sizeof(arr) 獲取陣列長度參數退化為指標額外傳長度或用容器
malloc(sizeof(ptr)) 以為分配陣列空間ptr 是指標,只得指標大小malloc(n * sizeof(*ptr))
結構體 sizeof 忽略對齊填充實際大小 ≥ 成員大小之和用 offsetof、sizeof 實測

最佳實踐總結

  • 求類型/對象佔用空間 → sizeof (編譯期、無開銷)
  • 求字符串有效長度 → strlen (運行期、遍歷計數)
  • 函數接收陣列 → 必須額外傳長度
  • 動態分配 → malloc(count * sizeof(*ptr)) 類型安全
  • 結構體傳輸/序列化 → 用 sizeof(struct) 含填充位元組
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved