while (p->num != num) {
p = p->next;
if (p = NULL) { // 錯誤在這裡!
printf("未查詢到該學生\n");
return;
}
}
if (p = NULL) 是賦值操作而非比較操作:
NULL (0) 賦值給指針 pp->num → 解引用空指針 → 內存不可讀崩潰// 方法一:比較操作符 ==
if (p == NULL) { ... }
// 方法二:防禦性編程(推薦)
if (NULL == p) { ... } // 若誤寫 = 編譯器報錯
// 方法三:循環條件前置判斷
while (p != NULL && p->num != num) {
p = p->next;
}
if (p == NULL) {
printf("未查詢到該學生\n");
return;
}
void selectnum(stu *head) {
int num, j;
stu *p = head;
printf("輸入要查詢的學號\n");
scanf("%d", &num);
// 修正:先判斷指針有效性
while (p != NULL && p->num != num) {
p = p->next;
}
if (p == NULL) {
printf("未查詢到該學生\n");
return;
}
printf("信息如下:\n");
printf("學號\t姓名\t電話\t\t郵箱\t地址\t生日(年 月 日)\n");
printf("%d %s %s %s %s %d %d %d\n",
p->num, p->name, p->call, p->email, p->address,
p->b.year, p->b.month, p->b.day);
printf("輸入: 1繼續.\n2結束.\n");
scanf("%d", &j);
if (j == 1) return;
else baymanu(); // 假設為菜單函數
}
這個錯誤是 C/C++ 初學者的「必經之路」,養成常量左值比較習慣能從根源杜絕。