C 語言中字符數組的行為常讓初學者困惑:數組名本身不可修改,但數組元素卻可以逐個修改。這背後涉及數組在內存中的存儲機制和編譯器處理邏輯。
char c[6] = "hello";
c = "s"; // 編譯錯誤:不可修改的左值
c[2] = 's'; // 正常:修改元素成功
c 是數組首元素地址的常量指針(相當於 char * const c)。編譯時期確定地址,運行時不可改變指向。這類似於 const 常量,一旦初始化就不能重新賦值。
數組 c[6] 在棧上分配了一塊連續的可讀寫內存區域。每個元素佔用 1 字節,通過下標訪問時編譯器計算偏移量(c + i),直接操作該內存地址,因此可自由修改。
char *p = "hello";
p[2] = 's'; // 運行時崩潰:嘗試修改只讀內存區
這裡 p 指向數據段/只讀數據段中的字符串字面量,屬於只讀內存,任何修改嘗試都會導致未定義行為(通常是段錯誤)。
理解這區別對掌握 C 語言內存模型、避免指針相關 Bug 至關重要。