首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++ 中 char* 與 char[] 的本質差異:記憶體佈局、可修改性與常見坑

     編輯:VC 教學

現象:為何一樣初始化 "abc",一個能改、一個會崩潰?

char*  c1 = "abc";  // 指向字串常值區
char   c2[] = "abc"; // 陣列在堆疊,內容可修改
char*  c3 = (char*)malloc(3);
c3 = "abc"; // 錯誤!洩漏 malloc 記憶體,c3 指向常值區

執行 c1[0] = 'X'; → 存取違規(常值區唯讀)。
執行 c2[0] = 'X'; → 正常,堆疊陣列可寫。

核心原因:C/C++ 程式記憶體五大區

區域存放內容生命週期可寫性
程式碼區機器指令程式結束唯讀
常值區字串常值、"abc"程式結束唯讀
全域/靜態區全域變數、static 變數程式結束可讀寫
堆疊區域變數、函數參數、返回位址函數返回釋放可讀寫
堆積malloc/new 配置手動 free/delete可讀寫

兩種宣告的記憶體佈局對比

char* p = "hello";
// p 在堆疊 (4/8 bytes)
// "hello\0" 在常值區 (6 bytes),p 指向該處

char a[] = "hello";
// a 在堆疊 (6 bytes),內容為 'h','e','l','l','o','\0'
// 無指標間接,直接操作陣列元素

sizeof 差異

char* p = "abc";
char a[] = "abc";
sizeof(p); // 4 或 8 (指標大小)
sizeof(a); // 4 (含結束符)

常見錯誤模式與修正

錯誤代碼問題修正
char* p = "abc"; p[0]='X';嘗試修改唯讀常值區改用 char p[] = "abc"; 或 strcpy 到堆積/堆疊緩衝區
char* p = (char*)malloc(4); p = "abc";洩漏 malloc 記憶體,p 指向常值區strcpy(p, "abc"); 複製內容
void f(char* s) { s = "new"; }只改變區域指標副本,呼叫端不受影響傳 char** 或回傳新指標,或用 std::string
char* p = "abc"; delete p;刪除非 new 記憶體 → 未定義行為絕對不要 delete/free 指向常值區/堆疊的指標

現代 C++ 最佳實踐

  • 優先使用 std::string 或 std::string_view(C++17),自動管理記憶體、避免指標陷阱。
  • 需 C 風格字串介面時:std::vector<char> buf(str.begin(), str.end()); buf.push_back('\0'); 取得可修改緩衝區。
  • 字串常值前加 const:const char* p = "abc"; 編譯器會阻擋修改嘗試。

結語

char* 是指標,指向哪裡由初始化決定;char[] 是陣列,自帶儲存空間。理解記憶體五大區、常值區唯讀、指標與陣列的型別差異,是寫出健壯 C/C++ 程式的基石。

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