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

C 語言核心概念:strlen 與 sizeof 的本質差異與避坑指南

     編輯:關於C語言

前言:為什麼必須搞懂這兩者?

在 C/C++ 開發中,strlen 與 sizeof 是最容易混淆卻又最關鍵的兩個概念。搞錯它們會導致緩衝區溢位、記憶體洩漏、邏輯錯誤等嚴重問題。本文從底層原理、編譯期與執行期差異、指針與陣列退化等多個維度徹底釐清。

strlen:執行期的字串長度計算器

函數原型

size_t strlen(const char *str);  // 標準 C
// VC6.0 中:extern unsigned int strlen(char *s);

核心機制

從指定位址開始掃描,遇到第一個 '\0' 結束符停止,回傳計數值(不含結束符)。

  • 屬於 <string.h> 函式庫函數
  • 執行期才能確定結果
  • 參數必須是以 '\0' 結尾的合法字串指標
  • 若傳入未初始化的陣列或非字串指標,行為未定義(可能跑飛)

典型陷阱

char aa[10];           // 未初始化
strlen(aa);            // ❌ 結果不定,可能導致段錯誤

char bb[10] = {'\0'};  // 明確初始化為空字串
strlen(bb);            // ✅ 0

char cc[10] = "jun";   // 自動補 '\0'
strlen(cc);            // ✅ 3

sizeof:編譯期的類型/物件大小運算子

核心特性

  • 關鍵字/運算子,非函數 → 括號可省略(變數名時)
  • 編譯期 即計算完成,零執行期開銷
  • 回傳 佔用記憶體位元組數(型別為 size_t)
  • 可接受型別名稱(需加括號)或變數/運算式作運算元

關鍵規則速查表

運算元sizeof 結果說明
char str[20] = "0123456789"20陣列總大小(含隱含 '\0')
char *ss = "0123456789"4/8指標本身大小(32/64 位元)
*ss1首字元大小
int a[10]4010 * sizeof(int)
short f(); sizeof(f())2函數回傳型別大小

核心差異總結:七大必懂要點

  1. 本質:strlen 是函數,sizeof 是運算子
  2. 計算時機:執行期 vs 編譯期
  3. 語意:字串邏輯長度 vs 記憶體佔用大小
  4. 參數:只接受 char* vs 任意型別/變數/運算式
  5. 陣列退化:傳給 strlen 退化為指標;sizeof 保留陣列完整資訊
  6. 結構體對齊:sizeof(struct) 會包含填充位元組
  7. 動態記憶體:sizeof 無法得知 malloc 分配的大小,只能得知指標大小

自製 strlen 實現參考

迭代版(推薦)

size_t my_strlen(const char *s) {
    const char *p = s;
    while (*p != '\0') ++p;
    return p - s;
}

遞迴版(教學用)

size_t my_strlen_rec(const char *s) {
    return (*s == '\0') ? 0 : 1 + my_strlen_rec(s + 1);
}

實戰建議

  • 字串處理用 strlen;記憶體操作(malloc、memcpy、陣列長度)用 sizeof
  • 函數參數為陣列時,務必額外傳遞長度,因為陣列會退化為指標
  • 結構體做序列化傳輸時,用 sizeof 計算緩衝區大小
  • 啟用編譯器警告(-Wall -Wextra)捕捉常見誤用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved