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。未初始化區域值不定(棧上),靜態/全局區自動歸零。
char arr[10]; arr = "Hello"; // 錯誤!數組名非左值,不可整體賦值 strcpy(arr, "Hello"); // 正確:運行期拷貝 arr[0] = 'H'; ... // 正確:逐元素賦值
只有聲明時的初始化列表/字符串字面量才能整體賦值,因為這屬於初始化而非賦值操作。
strncpy、snprintf、std::string 替代不安全函數。char* p = "Hello"; p[0] = 'h'; → 未定義行為(段錯誤)。必須用 const char* 或數組。sizeof(arr) 含 \0,strlen(arr) 不含 \0。優先使用 std::string(自動管理內存、支持嵌入 \0、豐富 API),僅在與 C API 交互、嵌入式受限環境、極致性能場景下使用字符數組。