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

C 語言字串指標操作:為何無法釋放字面常數記憶體

     編輯:程式設計綜合問答

程式碼錯誤分析

char *s1;
char *s2 = "bbb";
char *s3 = "ccc";
s1 = (char*)malloc(sizeof(s2)); // 錯誤:sizeof(s2) 只是指標大小(4/8 bytes),非字串長度
strcpy(s1, s2);
strcat(s1, s3);
// free(s2); // 錯誤嘗試
// free(s3); // 錯誤嘗試

核心誤區

  1. 字串字面常數存放於靜態資料區 (Read-only Data Segment),由編譯器配置、程式啟動時載入、程式結束時由作業系統回收,不在堆疊,不可用 free 釋放。
  2. sizeof(s2) 回傳指標大小,非字串長度。配置記憶體應用 strlen(s2) + 1。
  3. 指標賦值 ≠ 字串複製。s1 = s2 只是讓 s1 指向同一個字面常數,若後續嘗試修改內容會導致未定義行為 (Segmentation Fault)。

正確實作

char *s2 = "bbb";
char *s3 = "ccc";
// 1. 正確計算所需空間 (含結束符)
size_t len = strlen(s2) + strlen(s3) + 1;
char *s1 = malloc(len);
if (s1) {
    strcpy(s1, s2);
    strcat(s1, s3);
    printf("%s\n", s1); // 輸出: bbbccc
    free(s1); // 僅釋放動態配置的 s1
}
// s2, s3 為字面常數,無需也不可 free

補充:若需修改字串內容

char s2[] = "bbb"; // 陣列初始化,資料複製到堆疊,可修改
char s3[] = "ccc";

總結:字面常數唯讀、位於靜態區,勿嘗試 free;動態配置記憶體才需配對 free。

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