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

C 語言 strlen 與 sizeof 深度對比:字串長度 vs 物件大小

     編輯:關於C

函式/運算符原型

size_t strlen(const char *s);   // 函式,執行期計算
size_t sizeof(expression);      // 運算符,編譯期計算(大多數情況)

核心差異總覽

特性strlensizeof
性質庫函式運算符(關鍵字)
計算時機執行期編譯期(靜態陣列/型別)或執行期(VLA)
參數char*,必須以 \0 結尾型別或變數/運算式
語意字串實際長度(不含 \0)物件佔用位元組數
陣列退化陣列名退化為指標陣列名不退化,保留完整大小
動態記憶體可用只能得指標大小,無法得分配大小

經典範例對照

char str[20] = "0123456789";
int a = strlen(str);  // 10
int b = sizeof(str);  // 20

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

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

char ss3[100] = "0123456789";
sizeof(ss3);    // 100
strlen(ss3);    // 10

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

函式參數傳遞陷阱

void fun(char buf[8])   // 等價於 void fun(char *buf)
void fun(char buf[])    // 等價於 void fun(char *buf)

void fun(char *buf) {
    sizeof(buf);   // 4/8 (指標大小),非陣列大小!
}

解決方案:額外傳遞長度參數,或在函式內用 memcpy 複製到本地陣列。

結構體與對齊

struct X { int i; int j; char k; };  // 通常 12 bytes (對齊填充)
struct X x;
sizeof(X);  // 12
sizeof(x);  // 12
sizeof(&x); // 4/8 (指標)

自製 strlen 實現(五種寫法)

// 1. 陣列索引
size_t my_strlen1(const char *s) {
    size_t i = 0;
    while (s[i] != '\0') i++;
    return i;
}

// 2. 指標遞增
size_t my_strlen2(const char *s) {
    size_t len = 0;
    while (*s++) len++;
    return len;
}

// 3. 指標相減
size_t my_strlen3(const char *s) {
    const char *p = s;
    while (*p++);
    return p - s - 1;
}

// 4. 遞迴
size_t my_strlen4(const char *s) {
    return *s ? 1 + my_strlen4(s + 1) : 0;
}

// 5. 標準庫風格 (Linux kernel)
size_t my_strlen5(const char *s) {
    const char *sc;
    for (sc = s; *sc != '\0'; ++sc);
    return sc - s;
}

最佳實踐建議

  • 需要字串長度 → strlen。
  • 需要緩衝區/物件大小 → sizeof。
  • 處理二進制資料(可能含 \0)→ 必須用 sizeof 或顯式長度,不可用 strlen。
  • 函式介面設計:陣列參數必須配合長度參數,或改用結構體封裝 { void *data; size_t len; }。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved