首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 字符串指針數組排序:const char* 指向字面量不可修改,需複製到可寫緩衝區

     編輯:程式設計綜合問答

錯誤代碼


char *p[10] = {"wor", "trafifang", ...}; // 指向字符串字面量 (只讀區)
...
strcpy(p[k], p[i]); // 嘗試寫入只讀內存 → 段錯誤 / Access Violation

根因

  • 字符串字面量 `"wor"` 存儲在 **只讀數據段** (`.rodata`)。
  • `char *p[]` 存儲的是**指向只讀區的指針**。
  • `strcpy(p[k], ...)` 試圖通過指針**修改只讀內存** → **未定義行為**,現代 OS 直接發送 `SIGSEGV` / `STATUS_ACCESS_VIOLATION`。

三種修正方案

方案一:二維字符數組 (棧上可寫緩衝區) —— 最簡單


char p[10][20] = {"wor", "trafifang", ...}; // 每行 20 字節可寫空間
// 排序邏輯不變,strcpy 寫入 p[k] 合法
  • **注意**:第二維長度 **≥ 最長字符串 + 1** (含 `\0`)。原代碼 `[5]` 導致初始化截斷/溢出。

方案二:動態分配 + 深拷貝 (堆上可寫)


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]);

方案三:std::vector (C++ 標準庫,推薦)


#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';

關於 `*(p+i)` vs `p[i]` 的疑問

**完全等價**。C/C++ 定義 `p[i] == *(p+i)`。原代碼報錯**不是語法問題**,而是**運行期寫入只讀內存**。無論用哪種寫法,`strcpy(p[k], ...)` 目標地址都是只讀區,**必崩**。

總結

**字符串字面量不可寫**。排序需修改字符串順序/內容時,**必須先複製到可寫內存** (二維數組、malloc、std::string)。現代 C++ **直接用 `std::vector + std::sort`**,零內存管理負擔、零越界風險、泛型通用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved