char *p[10] = {"wor", "trafifang", ...}; // 指向字符串字面量 (只讀區)
...
strcpy(p[k], p[i]); // 嘗試寫入只讀內存 → 段錯誤 / Access Violation
char p[10][20] = {"wor", "trafifang", ...}; // 每行 20 字節可寫空間
// 排序邏輯不變,strcpy 寫入 p[k] 合法
char *p[10];
const char *src[10] = {"wor", "trafifang", ...};
for (int i = 0; i < 10; i++) {
p[i] = malloc(strlen(src[i]) + 1);
strcpy(p[i], src[i]);
}
// 排序後記得 free
for (int i = 0; i < 10; i++) free(p[i]);
#include
#include
#include
std::vector v = {"wor", "trafifang", "pand", "dai", "lamada", "string", "t", "ra", "lenth", "recte"};
std::sort(v.begin(), v.end()); // 自動處理內存、比較、交換
for (auto &s : v) cout << s << '\n';
**完全等價**。C/C++ 定義 `p[i] == *(p+i)`。原代碼報錯**不是語法問題**,而是**運行期寫入只讀內存**。無論用哪種寫法,`strcpy(p[k], ...)` 目標地址都是只讀區,**必崩**。
**字符串字面量不可寫**。排序需修改字符串順序/內容時,**必須先複製到可寫內存** (二維數組、malloc、std::string)。現代 C++ **直接用 `std::vector