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

C/C++ 字符串核心機制:結尾符、內存佈局與常見陷阱

     編輯:C++ 入門

C/C++ 字符串核心機制:結尾符、內存佈局與常見陷阱

C/C++ 字符串以空字符 `\0` 結尾,這是所有標準庫函數(`strlen`、`strcpy`、`printf` 等)正確工作的前提。

核心規則

  1. 字符串字面量 `"abc"` 在內存中存儲為 `'a','b','c','\0'`
  2. 字符數組需預留 `\0` 空間:`char str[10]` 最大存 9 字符
  3. `strcpy` 不檢查目標大小,極易緩衝區溢出

經典越界錯誤

char str[10];
strcpy(str, "0123456789"); // 10字符 + \0 = 11字節 → 越界寫入 1 字節

// 正確做法
char str[11]; // 或 strlen(src)+1
strcpy(str, "0123456789");

字符串字面量 vs 字符數組

char str1[] = "Hello";  // 棧上數組,內容可修改,每次調用新建副本
char str2[] = "Hello";  // 另一個獨立數組
char *str3 = "Hello";   // 指向只讀數據段的字面量
char *str4 = "Hello";   // 可能指向同一地址(編譯器優化)

地址比較陷阱

char str1[] = "Hello";
char str2[] = "Hello";
char *str3 = "Hello";
char *str4 = "Hello";

(str1 == str2)  // false:兩個獨立數組,地址不同
(str3 == str4)  // true (通常):指向同一字面量常量區地址

內存佈局圖解

代碼區 (Text)          : 指令
只讀數據區             : "Hello" 字面量 (str3, str4 指向這裡)
數據區 / BSS           : 全局/靜態變量
棧                     : str1[], str2[] (各自獨立副本)
堆                     : malloc/new 分配

安全字符串操作最佳實踐

不安全函數安全替代說明
strcpystrncpy / strcpy_s指定目標大小
strcatstrncat / strcat_s指定剩餘空間
sprintfsnprintf指定緩衝區大小
getsfgets指定大小,移除換行

C++ string 類優勢

#include <string>
string s = "Hello";
s += " World";      // 自動擴容
cout << s.size();   // 長度 O(1)
cout << s[0];       // 可修改
// 無需手動管理 \0、內存、越界

關鍵總結

  1. 永遠記住 `\0` 佔用 1 字節
  2. 字面量在只讀區,不可修改(`*str3 = 'h'` 崩潰)
  3. 數組名退化為指針時失去大小信息
  4. 優先使用 `std::string` 避免 90% 字符串 Bug
  5. 必須用 C 風格時:檢查大小、用安全版本、考慮 `std::vector<char>`

深入理解字符串在內存中的真實佈局,是避免緩衝區溢出、邏輯錯誤、安全漏洞的基石。

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