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

sizeof vs strlen:核心區別、常見誤區與實戰對照表

     編輯:關於C語言

本質區別

特性sizeofstrlen
性質編譯期運算符運行期庫函數
參數類型/變量/表達式char*(以 \0 結尾)
語義佔用內存位元組數字符串有效長度(不含 \0)
結果類型size_t (unsigned)size_t
數組參數不退化,得整個數組大小退化為指針,得字符串長度

經典對照

char str[20] = "0123456789";  // 10 字符 + \0
int a = strlen(str);  // 10
int b = sizeof(str);  // 20 (數組總大小)

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

進階規則

  1. sizeof(類型) 必須加括號;sizeof 變量 可不加。
  2. 結構體 sizeof 含對齊填充位元組。
  3. 靜態數組 sizeof 得全大小;動態分配/外部數組無法通過 sizeof 得知大小。
  4. 函數參數為數組時退化為指針:void fun(char[8]) ≡ void fun(char*),sizeof 僅得指針大小。
  5. 需在函數內知曉數組大小 → 額外傳長度參數或結構體封裝。

常見誤區

// 錯誤:試圖用 sizeof 獲取動態數組大小
void foo(char *p) {
    int n = sizeof(p); // 得 4/8,非預期
}

// 正確:額外傳長度
void foo(char *p, int len) {
    char *buf = malloc(len + 1);
    memcpy(buf, p, len);
}

記憶口訣

sizeof 看類型/定義,靜態多大算多大;
strlen 看內容,遇 \0 就停下。

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