現象:運行到鏈表賦值邏輯時拋出「內存不能為 read」,代碼片段涉及 CURVE_DATA *first_node=NULL;、data_head=first_head; 等指針操作。初學者往往誤以為是鏈表指針鏈接錯誤,實則不然。
depth[ROW] 定義過小排查發現,錯誤發生在後續的深度計算循環中:
float depth[ROW]; // ROW 定義太小
int lineNum = (maxDepth - minDepth) / delta; // 實際需要元素數
for (int row = 0; row < lineNum; row++) {
depth[row] = minDepth + delta * row; // 越界寫入,破壞堆棧
}
當 lineNum > ROW 時,循環寫入超出數組邊界,破壞相鄰變量(如鏈表指針),導致後續解引用時讀取到垃圾地址,拋出「不能 read」。
std::vector depth(lineNum); 或 new float[lineNum] 替換固定大小數組。ASSERT(lineNum <= ROW); 或 if (lineNum > ROW) return ERROR;。std::list<CURVE_DATA> 或 std::vector<CURVE_DATA>,配合智能指針自動管理內存。NULL。/RTCsu(運行時檢查)或使用 Application Verifier、Visual Studio 內存診斷工具定位首次越寫點。CArray、CList 等容器類已處理擴容與邊界,優先於手工 new/delete。補充:若確需手工管理鏈表,請嚴格遵循「分配即初始化、刪除即置空、遍歷不修改結構」三原則。