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

C/C++ 字符數組與字符串終結符 \0 深度解析

     編輯:C++ 入門

字符串本質:以 \0 結尾的字符數組

C 風格字符串本質是以空字符 \0 結尾的字符數組。標準庫函數(strlen、strcpy、printf("%s") 等)均通過掃描 \0 確定字符串邊界。

聲明與初始化

// 1. 靜態數組,編譯器自動補 \0
char str1[] = "Hello";          // 實際大小 6:H e l l o \0
char str2[20] = "Hello";        // 餘下填充 \0

// 2. 顯式列表初始化(需手動加 \0)
char str3[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

// 3. 指針指向字符串字面量(常量區,不可修改)
const char* p = "Hello";

內存佈局圖解

str1:  H  e  l  l  o  \0  ?  ?  ?  ...
index: 0  1  2  3  4  5   6  7  8

數組大小 ≥ 字符串長度 + 1。未初始化區域值不定(棧上),靜態/全局區自動歸零。

關鍵限制:賦值 vs 初始化

char arr[10];
arr = "Hello";      // 錯誤!數組名非左值,不可整體賦值
strcpy(arr, "Hello"); // 正確:運行期拷貝
arr[0] = 'H'; ...   // 正確:逐元素賦值

只有聲明時的初始化列表/字符串字面量才能整體賦值,因為這屬於初始化而非賦值操作。

常見陷阱與最佳實踐

  1. 缺少 \0 導致越界讀取:手動構建字符串必須確保結尾 \0。
  2. 緩衝區溢出:使用 strncpy、snprintf、std::string 替代不安全函數。
  3. 修改字符串字面量:char* p = "Hello"; p[0] = 'h'; → 未定義行為(段錯誤)。必須用 const char* 或數組。
  4. sizeof vs strlen:sizeof(arr) 含 \0,strlen(arr) 不含 \0。

現代 C++ 建議

優先使用 std::string(自動管理內存、支持嵌入 \0、豐富 API),僅在與 C API 交互、嵌入式受限環境、極致性能場景下使用字符數組。

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