`char *ptr = "hello";` **不會複製字符串內容**,而是:
// 代碼
char *p1 = "hello";
char *p2 = "hello";
char arr[] = "hello";
// 內存佈局 (概念圖)
只讀數據段 (.rodata) 棧/數據段
+-------------------+ +-------------------+
| 'h','e','l','l','o','\0' | ← p1 (0x400000) | p1 指針變量 (8字節) |
| | ← p2 (0x400000) | p2 指針變量 (8字節) |
+-------------------+ | arr[6] (可修改) |
+-------------------+
// p1 == p2 為 true (編譯器優化合併相同字面量)
// arr 獨立拷貝一份,可修改 arr[0] = 'H'
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
| `char *p = "hello"; p[0] = 'H';` | 嘗試修改只讀內存 → 崩潰 | `char p[] = "hello"; p[0] = 'H';` (數組在棧上,可寫) |
| `char *p; scanf("%s", p);` | `p` 未指向有效內存 → 野指針崩潰 | `char buf[100]; scanf("%s", buf);` 或 `malloc` 分配 |
| `char *p = malloc(10); p = "hello";` | 內存洩漏 (malloc 內存丟失),`p` 指向只讀區 | `strcpy(p, "hello");` 複製內容到堆內存 |