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); // 錯誤嘗試
sizeof(s2) 回傳指標大小,非字串長度。配置記憶體應用 strlen(s2) + 1。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。