char a[] = "abcdef";
char *p = "abcdef";
| 特性 | char a[] | char *p |
|---|---|---|
| 存儲位置 | 棧區(或數據段,視作用域而定) | 指針變量在棧,字面量在只讀數據段 |
| 可修改性 | 內容可修改 | 指向只讀內存,嘗試修改導致未定義行為 |
| sizeof 結果 | 7(含結束符 \0) | 指針大小(32位為4,64位為8) |
| 賦值操作 | 不可整體賦值 | 可指向其他字符串 |
char a[]:在棧上分配 7 個字節,複製字面量 "abcdef\0" 到該數組。
char *p:在棧上分配指針變量 p,指向只讀數據段中的 "abcdef\0"。
char *p = "hello";
p[0] = 'H'; // 運行時崩潰:嘗試寫入只讀內存
char a[] = "hello";
a[0] = 'H'; // 正確,a 可修改
char arr[] = "..." 或動態分配 malloc。printf)可用 const char *p = "...",編譯器會提示寫入違規。