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

C++ 字串解析與結構體陣列初始化:memset 清零避免亂碼輸出

     編輯:程式設計疑難解答

問題現象

結構體陣列 FF ff[DOU] 中 first/second 為 char[100],未初始化導致輸出包含隨機亂碼,strlen 計算長度異常。

根因

new FF[DOU] 僅分配記憶體,**不會**自動將字元陣列置零。殘留記憶體內容被視為字串一部分。

修正:構造函數或 memset

struct FF {
    char first[100];
    char second[100];
    bool flag;
    FF() { memset(first, 0, sizeof(first)); memset(second, 0, sizeof(second)); flag = false; }
};
或分配後立即清零:
FF *ff = new FF[DOU];
for (int i = 0; i < DOU; ++i) {
    memset(ff[i].first, 0, sizeof(ff[i].first));
    memset(ff[i].second, 0, sizeof(ff[i].second));
}

解析輸出異常

首次輸出 ff[0].first 長度非 1,因為記憶體中恰好在有效字元後遇到 \0,但前方殘留資料被 strlen 計入;後續元素同理。

最佳實踐

  • 結構體含 POD 陣列時,**務必定義預設構造函數清零**。
  • 改用 std::string、std::array、std::vector 避免手動記憶體管理。
  • 調試時在 Visual Studio 觀察「Memory Window」確認記憶體佈局。
運行截圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved