char *p = (char*)malloc(sizeof(char)); // 僅分配 1 字節!
char *px = p;
p = "sajjjmmij"; // 關鍵錯誤:p 指向常量區,px 仍指向 malloc 區
printf("%s,%s", p, px); // px 輸出亂碼
執行前: p ─────→ [Heap: 1 byte] ←──── px 執行 p = "sajjjmmij" 後: p ─────→ [Read-only Data: "sajjjmmij\0"] px ─────→ [Heap: 1 byte] (未初始化,內容隨機)
sizeof(char) = 1 字節,無法存放字符串。p = "..." 使 p 指向只讀數據段,原 malloc 內存地址丟失(內存洩漏),px 成為懸空指針。strcpy 或 memcpy 將字符串拷貝到 malloc 區。char *p = (char*)malloc(100 * sizeof(char)); // 1. 足夠空間
char *px = p; // 2. 同指向堆區
strcpy(p, "sajjjmmij"); // 3. 拷貝內容,而非改變指向
printf("%s,%s", p, px); // 4. 同輸出 "sajjjmmij"
free(px); // 5. 釋放(px 或 p 均可,同一地址)
| 類型 | 存儲區 | 可修改 | 生命週期 |
|---|---|---|---|
字符串字面量 "abc" | 只讀數據段 (.rodata) | 否(UB) | 程序全周期 |
char arr[] = "abc" | 棧 (或數據段) | 是 | 作用域結束 |
char *p = malloc() | 堆 | 是 | 手動 free まで |
p = "string" 是修改指針指向,而非修改指向內存的內容。要在堆上構建字符串,必須分配足夠空間 → 拷貝內容。牢記:指針變量存地址,賦值改地址;解引用改內容。