代碼中`HuffmanCode HC`定義為`char**`(字符指針數組),寫入時用`fwrite(HC[i], sizeof(char), strlen(HC[i])+1, fp)`逐個寫入字符串,**但讀取時未為`HC[i]`分配內存**,導致`fread`寫入野指針崩潰。本文解析雙向序列化正確流程。
// 寫入:正確
for (int i = 1; i <= n; i++)
fwrite(HC[i], sizeof(char), strlen(HC[i]) + 1, fp); // 寫入字符串含\0
// 讀取:錯誤
for (int i = 1; i <= n; i++)
fread(HC[i], sizeof(char), strlen(HC[i]) + 1, fp); // HC[i] 未分配內存!野指針寫入
因字符串長度不定,**必須在文件中存儲長度**,讀取時先讀長度,再分配,再讀內容。
for (int i = 1; i <= n; i++) {
int len = strlen(HC[i]) + 1; // 含\0
fwrite(&len, sizeof(int), 1, fp); // 1. 寫入長度
fwrite(HC[i], sizeof(char), len, fp); // 2. 寫入字符串
}
// 假設 HC 已分配指針數組:HC = (char**)malloc((n+1) * sizeof(char*));
for (int i = 1; i <= n; i++) {
int len;
if (fread(&len, sizeof(int), 1, fp) != 1) break; // 讀長度
HC[i] = (char*)malloc(len); // 關鍵:分配內存!
if (HC[i] == NULL) { /* 錯誤處理 */ }
if (fread(HC[i], sizeof(char), len, fp) != len) { /* 錯誤處理 */ }
}
// 文件頭
struct HuffmanFileHeader {
int n; // 葉子節點數/編碼數量
int maxCodeLen; // 最大編碼長度(可選)
// 保留字節...
};
// 數據區:n 條記錄
// 每條:int len; char code[len];
序列化指針數組鐵律:文件存長度,讀取先malloc,嚴格對稱,內存有借有還。