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

C++ 字元陣列存字串常見錯誤:指向區域變數地址導致資料覆蓋

     編輯:程式設計綜合問答

經典陷阱:迴圈中將字串格式化到區域陣列 ch2,再將指標存入指標陣列 tupiandizhi,迴圈結束 ch2 生命週期結束,所有指標指向同一塊已失效記憶體,最終顯示最後一次寫入的內容 (或亂碼)。

錯誤代碼

char *tupiandizhi[3];
for (int u = 0; u < 3; u++) {
    char ch2[30]; // 區域陣列,棧上,每次迴圈重用同一塊記憶體
    sprintf(ch2, "%s%d%s", "d:\\sift\\(", u, ").jpg");
    tupiandizhi[u] = ch2; // 存入指標,指向 ch2
}
// 迴圈結束,ch2 銷毀,tupiandizhi[0..2] 皆成懸空指標

修正方案一:動態分配 (需手動釋放)

for (int u = 0; u < 3; u++) {
    tupiandizhi[u] = new char[30]; // 堆上分配,生命週期手動控制
    sprintf(tupiandizhi[u], "d:\\sift\\(%d).jpg", u);
}
// 使用完畢
for (int u = 0; u < 3; u++) delete[] tupiandizhi[u];

修正方案二:std::string 容器 (現代 C++ 首選)

std::vector<std::string> tupiandizhi;
for (int u = 0; u < 3; u++) {
    tupiandizhi.push_back("d:\\sift\\(" + std::to_string(u) + ").jpg");
}
// 自動管理記憶體,無需手動釋放,支援複製、移動、擴容

修正方案三:固定大小二維陣列 (若數量固定、長度有上限)

char tupiandizhi[3][30]; // 連續儲存,無指標間接
for (int u = 0; u < 3; u++) {
    sprintf(tupiandizhi[u], "d:\\sift\\(%d).jpg", u);
}

核心原則

  • 永不儲存區域變數地址供後續使用。
  • 優先使用 std::string, std::vector 等 RAII 容器。
  • 若必須用裸指標,明確所有權:誰分配、誰釋放、生命週期範圍。

現代 C++ 開發:**拒絕裸指標管理字串,擁抱 std::string**。

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