// ❌ 錯誤代碼:運行時崩潰
char* s = "12";
char t = s[0];
s[0] = s[1]; // Segmentation Fault / Access Violation
s[1] = t;
// ✅ 正確代碼
char s[] = "12"; // 或 char s[3] = "12";
char t = s[0];
s[0] = s[1];
s[1] = t; // 成功交換,s 變為 "21"
| 寫法 | 類型 | 存儲區域 | 可修改性 | 內存圖解 |
|---|---|---|---|---|
char* s = "12"; | 指向字符串字面量的指針 | 只讀數據段 (.rodata / .text) | ❌ 唯讀,寫入觸發硬件異常 | s (棧) → "12\0" (只讀區) |
char s[] = "12"; | 字符數組 | 棧區 (函數棧幀) | ✅ 可讀寫,編譯器自動複製字面量到數組 | s (棧) = {'1','2','\0'} |
C/C++ 標準規定:字符串字面量具有靜態存儲期限,且為不可修改。編譯器通常將其放入只讀內存頁,任何嘗試修改的行為屬於未定義行為(UB)。
若必須用指針且需要修改:
// 方式 1:malloc + strcpy (C 風格)
char* s = (char*)malloc(3);
strcpy(s, "12");
// ... 修改 s ...
free(s);
// 方式 2:new + strcpy (C++ 風格)
char* s = new char[3];
strcpy(s, "12");
// ... 修改 s ...
delete[] s;
// 方式 3:std::string (現代 C++ 首選)
std::string s = "12";
std::swap(s[0], s[1]); // 安全、簡潔、自動管理內存
char* s = "..." 是指向只讀區的指針,不可修改內容;char s[] = "..." 是棧上可變數組,內容可修改。現代 C++ 開發請優先使用 std::string 或 std::string_view(C++17),杜絕裸指針操作字符串,從源頭消除此類 UB。