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

C/C++ sizeof vs strlen 完整對比:編譯期/執行期、類型/字串、陣列/指標退化全方位解析

     編輯:關於C語言

一、 核心差異速查表

維度sizeofstrlen
性質運算子 (關鍵字)函式 (<string.h>)
計算時機編譯期 (常數摺疊)執行期
參數類型任意型別/變數/運算式const char* (以 \0 結尾)
回傳值型別/物件佔用 位元組數 (含結構對齊填充)字串 字元長度 (不含結束符 \0)
陣列參數不退化,得整個陣列大小退化為指標,得指標大小
動態記憶體得指標大小,無法得知分配大小正常運作 (若以 \0 結尾)
結果型別size_t (無號整數)size_t

二、 經典陷阱實戰演示

1. 陣列 vs 指標

char str[] = "hello";   // 陣列,大小 6 (含 \0)
char *p    = "hello";   // 指標,指向常數區

sizeof(str); // 6  ✅
strlen(str); // 5  ✅

sizeof(p);   // 4/8 (指標大小) ❌ 非字串長度
strlen(p);   // 5  ✅

2. 結構體對齊

struct A { char c; int i; }; // 典型對齊:c(1) + padding(3) + i(4) = 8
sizeof(struct A); // 8 (含填充位元組)
#pragma pack(1)
struct B { char c; int i; };
#pragma pack()
sizeof(struct B); // 5 (無填充)

3. 函式參數退化

void Func(char arr[100]) {
    sizeof(arr); // 4/8 (退化為 char*) ❌
}
void Func2(char *ptr) {
    sizeof(ptr); // 4/8
}
// 解決:額外傳長度參數,或用結構體包裹陣列

4. 不完整型別

extern int arr[]; // 不完整型別 (無大小)
sizeof(arr); // 編譯錯誤 ❌

三、 進階細節

  1. sizeof 運算元若是型別名稱,必須加括號:sizeof(int)。變數名可不加:sizeof var。
  2. sizeof 不求值運算元:sizeof(i++) 不會讓 i 遞增。
  3. strlen 依賴 \0,若字串未正確結尾 → 越界讀取 → UB。
  4. C++ std::string/std::vector 用 .size(),勿用 sizeof。

四、 記憶口訣

sizeof 看型別,編譯期定乾坤;
strlen 數字元,執行期尋 \\0 根。
陣列不退化,sizeof 量全身;
指標退化殘,sizeof 只量尖。
動態記憶體,sizeof 盲無邊;
結構對齊隱,sizeof 知淵源。

總結

sizeof 是靜態型別系統的鏡子,映照編譯期已知的位元組佔用;strlen 是執行期字串處理的尺子,量度以 \0 為界的字元長度。搞清「陣列退化」、「動態記憶體無長度」、「結構對齊」三大陷阱,方能精準用尺。

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