經典陷阱:迴圈中將字串格式化到區域陣列 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::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**。