首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言動態鏈表建立 scanf 格式字串錯誤導致記憶體無法寫入

     編輯:程式設計綜合問答

錯誤程式碼片段

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 失敗檢查與尾節點釋放,即可穩定建立鏈表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved