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

C++ 字元陣列深度解析:結束空字元與記憶體視覺化

     編輯:關於C++

為什麼 C++ 用字元陣列而非字串型別?

C++ 繼承 C 的設計:字串 = char 陣列 + 結束空字元 (Null Terminator)。

char text[] = "This is a string."; // 17 可見字元 + 1 個 \0 = 18 bytes

編譯器自動在尾部補上 '\0'(ASCII 0),標記字串結束。這是 C 風格字串的靈魂。

實驗:手動植入結束符

char str[] = "This is a string.";
cout << str << endl; // 輸出完整字串

str[7] = '\0'; // 第 8 個字元位置植入結束符
cout << str << endl; // 僅輸出 "This is"

記憶體前後對比

狀態記憶體內容(每格 1 byte)
修改前T h i s _ i s _ a _ s t r i n g . \0
修改後T h i s _ i s \0 a _ s t r i n g . \0

邏輯長度截斷於第一個 \0,但物理記憶體未變,後續資料仍殘留(不可訪問)。

單引號 vs 雙引號:型別嚴格區分

  • 單引號 '\0':字元字面值 → 整數值 0(char 型別)。
  • 雙引號 "\0":字串字面值 → 含結束符的陣列(const char[2])。
str[7] = '\0'; // ✅ 正確:賦予字元值 0
str[7] = 0;    // ✅ 等價:0 隱式轉為 char
str[7] = "\0"; // ❌ 編譯錯誤:型別不匹配

口訣:單一字元用單引號,字串字面值用雙引號。搞錯直接編譯報錯,好debug。

避坑指南

  1. 永遠預留 +1 空間給 \0:宣告陣列大小 = 最大字串長度 + 1。
  2. 手動修改字串長度後,確保新結束符就位。
  3. 輸入處理:cin.getline(buf, size) 自動處理結束符,比 cin >> buf 安全(後者不防溢位)。
  4. 現代替代:std::string 內部自動管理結束符與容量,徹底消除此類 Bug。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved