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

C 語言 sizeof 與 strlen 徹底解析:編譯期 vs 執行期的本質差異

     編輯:關於C語言

sizeof 是運算子,編譯期計算;strlen 是函數,執行期遍歷計算。兩者核心差異在於「測量什麼」與「何時測量」。

核心對照表

特性sizeofstrlen
類型運算子 (關鍵字)函數 (<string.h>)
計算時機編譯期執行期
參數類型型別、變數、表達式const char* (C 字串)
測量對象物件佔用位元組數 (含結尾 \0)字串長度 (不含結尾 \0)
陣列參數不退化,得知完整大小退化為指標,僅得指標大小

經典範例解析


char ss[] = "string";  /* 長度 7:'s','t','r','i','n','g','\0' */
printf("%zu %zu\n", sizeof(ss), strlen(ss));  /* 輸出:7 6 */

char *p = "string";
printf("%zu %zu\n", sizeof(p), strlen(p));    /* 輸出:8 6 (64 位系統指標 8 bytes) */

關鍵場景對決

1. 字元陣列 vs 字元指標


char arr[20] = "hello";
char *ptr = "hello";

sizeof(arr)  → 20  (陣列宣告大小)
sizeof(ptr)  → 8   (指標大小)
strlen(arr)  → 5   (字串長度)
strlen(ptr)  → 5   (字串長度)

2. 內嵌 \0 的字串


char s[] = "ab\0cd";
sizeof(s)  → 6  (含兩個 \0)
strlen(s)  → 2  (遇第一個 \0 停止)

3. 函數參數傳遞


void func(char buf[100]) {
  sizeof(buf);  // 8 (退化為指標)
}
void func2(char *buf) { /* 同上 */ }

函數參數中陣列一律退化為指標,sizeof 失去陣列大小資訊。解決方案:額外傳遞長度參數或使用結構體封裝。

實務準則

  • 需要配置緩衝區大小、序列化、結構體大小 → sizeof
  • 需要字串實際長度、解析字串、輸出字串 → strlen
  • C++ 優先使用 std::string::size()、std::vector::size()、std::span (C++20)

口訣:sizeof 看盒子多大,strlen 看裡面字串多長。

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