C/C++ 字符串以空字符 `\0` 結尾,這是所有標準庫函數(`strlen`、`strcpy`、`printf` 等)正確工作的前提。
char str[10]; strcpy(str, "0123456789"); // 10字符 + \0 = 11字節 → 越界寫入 1 字節 // 正確做法 char str[11]; // 或 strlen(src)+1 strcpy(str, "0123456789");
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 分配
| 不安全函數 | 安全替代 | 說明 |
|---|---|---|
| strcpy | strncpy / strcpy_s | 指定目標大小 |
| strcat | strncat / strcat_s | 指定剩餘空間 |
| sprintf | snprintf | 指定緩衝區大小 |
| gets | fgets | 指定大小,移除換行 |
#include <string> string s = "Hello"; s += " World"; // 自動擴容 cout << s.size(); // 長度 O(1) cout << s[0]; // 可修改 // 無需手動管理 \0、內存、越界
深入理解字符串在內存中的真實佈局,是避免緩衝區溢出、邏輯錯誤、安全漏洞的基石。