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

解決 Linux 下 memcpy 段錯誤:字符串字面量只讀陷阱

     編輯:關於C

問題現象

int main() {
    char *a = "11111111";
    char *b = "2222222";
    memcpy(a, b, 8); // 段錯誤
    return 0;
}

Linux 下崩潰,Unix 下可能正常(實現差異)。

根本原因

  • "11111111" 是字符串字面量,存儲在只讀數據段(.rodata)
  • char *a 指向只讀內存
  • memcpy 嘗試寫入只讀區域 → 段錯誤
  • Unix 歷史實現可能將字面量放在可寫段,但不符合標準

正確解決方案

方案一:使用數組(棧上分配,可寫)

int main() {
    char a[] = "11111111"; // 數組初始化,內容拷貝到棧
    char b[] = "2222222";
    memcpy(a, b, 8); // 正常
    return 0;
}

方案二:動態分配內存

int main() {
    char *a = malloc(9);
    char *b = malloc(9);
    strcpy(a, "11111111");
    strcpy(b, "2222222");
    memcpy(a, b, 8);
    free(a); free(b);
    return 0;
}

方案三:const 修飾防止誤寫


const char *a = "11111111"; // 編譯器阻止修改操作
// memcpy(a, b, 8); // 編譯錯誤:discards 'const' qualifier

核心知識點總結

聲明方式存儲區域可修改用途
char *p = "str".rodata (只讀)否只讀訪問
char p[] = "str"棧 (或數據段)是需修改內容
char *p = malloc()堆是動態大小/長生命周期

最佳實踐

  1. 字符串字面量必須用 const char * 接收
  2. 需修改字符串時,使用數組或動態分配
  3. 啟用編譯器警告 -Wwrite-strings(C++ 默認開啟)
  4. 嵌入式開發特別注意:只讀段可能在 Flash,寫入會導致硬件異常
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved