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

C/C++ 基礎測驗 No.1:sizeof 與 strlen 字串長度計算差異完整解析

     編輯:關於C語言

核心概念區分

  • sizeof:編譯期運算子,返回類型/變數佔用**位元組數**(含結構對齊填充)。對陣列返回總大小;對指標返回指標大小 (4/8 字節)。**不計算內容**。
  • strlen:執行期函數,遍歷字串直到 '\0',返回**字元數**(不含結尾符)。參數必須為以空字元結尾的有效指標,**行為未定義**若無終止符。

題目變數定義

char *str_1 = "12345";           // 指向字串常量區
char str_2[] = "12345";          // 陣列,大小 6 (含 \0)
char str_3[5] = { '1' };         // 陣列大小 5,內容 '1','\0','\0','\0','\0'
char str_4[5] = { '1','2','3','4','5' }; // 陣列大小 5,**無結尾 \0**

表達式求值表

表達式值解析
sizeof(str_1)4 或 8指標大小 (32/64 位)
sizeof(*str_1)1解引用為 char,1 字節
strlen(str_1)5常量區 "12345\0" 長度 5
sizeof(str_2)6陣列總大小 (含 \0)
strlen(str_2)5遇到 \0 停止
sizeof(str_3)5陣列聲明大小
strlen(str_3)1首字元 '1' 後即 \0
sizeof(str_4)5陣列聲明大小
strlen(str_4)未定義 (隨機值/崩潰)**無 \0 終止符**,越界訪問
strlen(*str_1)編譯錯誤*str_1 為 char,非指標,類型不匹配

關鍵陷阱總結

  1. 指標 vs 陣列:sizeof(指標) ≠ 字串長度;sizeof(陣列) = 總位元組數。
  2. 結尾符 \0:strlen 依賴 \0,缺失導致 UB。str_4 是經典陷阱。
  3. 編譯期 vs 執行期:sizeof 無運行開銷;strlen 需遍歷。
  4. 類型安全:strlen 要求 const char*,傳 char 會報錯。

最佳實踐

  • C++ 偏好 std::string / std::string_view,.size() 統一語意、無 UB。
  • C 風格字串:定義陣列時**留空一位給 \0**,或用複合字面值 char s[] = "abc"; 自動計算。
  • 需字串長度時用 strlen;需分配緩衝區大小用 sizeof (陣列) 或 strlen+1 (指標)。

總結

sizeof 問「佔多少記憶體」,strlen 問「有多少可見字元」。搞清**類型(指標/陣列)**、**生命週期(編譯/執行)**、**終止符依賴**,即可徹底掌握此類基礎考點。

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