scanf("%d %d", p1->number, p1->score); // 缺少 & 取址運算子
p1->number 值(未初始化垃圾值)被當作位址傳給 scanf。scanf 嘗試向該隨機位址寫入 → Access violation / 該記憶體不能為 written。scanf("%d %d", &p1->number, &p1->score); // 加上 &
struct Student *creat(void) {
struct Student *head = NULL, *p1, *p2;
int n = 0;
p1 = p2 = (struct Student*)malloc(LEN);
printf("請輸入學號 成績 (學號 0 結束): ");
while (scanf("%d %d", &p1->number, &p1->score) == 2 && p1->number != 0) {
n++;
if (n == 1) head = p1;
else p2->next = p1;
p2 = p1;
p1 = (struct Student*)malloc(LEN);
printf("請輸入學號 成績 (學號 0 結束): ");
}
p2->next = NULL;
free(p1); // 釋放最後多配置的節點
return head;
}
malloc 回傳值是否為 NULL。fgets + sscanf 避免緩衝區殘留問題。while (p != NULL) 而非 p->number != 0(資料域可能為 0)。scanf 參數必須為位址(&var)。缺少 & 導致隨機位址寫入,觸發記憶體存取違規。修正後並補上 malloc 失敗檢查與尾節點釋放,即可穩定建立鏈表。