在VC++6.0環境下運行車場管理系統時,執行「車輛離場」功能(第2功能)程序崩潰。代碼涉及鏈隊列模擬車場、棧模擬便道,典型的數據結構綜合應用。
// 原代碼片段存在的關鍵問題
void Zhaninit(Zhan *s) {
int i;
s->top=0;
for(i=0; i<=max; i++)
s->b[s->top]=NULL; // 錯誤:應為 s->b[i]=NULL
}
int queueinit(link *U) {
U->lead=(queue *)malloc(sizeof(queue));
if(U->lead!=NULL) {
U->lead->next=NULL;
U->end=U->end; // 錯誤:未初始化end指針,應為 U->end=U->lead
return 1;
}
return -1;
}
// 棧初始化修正
void Zhaninit(Zhan *s) {
s->top = -1; // 空棧標識為-1更直觀
for(int i=0; i<=max; i++)
s->b[i] = NULL;
}
// 隊列初始化修正
int queueinit(link *U) {
U->lead = (queue *)malloc(sizeof(queue));
if (!U->lead) return -1;
U->lead->next = NULL;
U->end = U->lead; // 關鍵修正:尾指針指向頭節點
return 1;
}
// 入隊操作修正
int Arrival(Zhan *into, link *R) {
Carinfo *p = (Carinfo *)malloc(sizeof(Carinfo));
if (!p) return 0;
printf("\n車牌號: ");
fgets(p->num, 10, stdin); // 替代危險的gets()
p->num[strcspn(p->num, "\n")] = 0; // 去除換行符
if (into->top < max) {
into->b[++into->top] = p; // 先增後用
printf("\n車輛在第%d位置.", into->top+1);
return 1;
}
// 車場滿,進入隊列等待...
return 0;
}
該崩潰本質是指針未初始化與數組下標錯誤導致的未定義行為。現代C++開發應拒絕裸指針,擁抱RAII與標準庫容器,從源頭消除此類低級錯誤。