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

C語言鏈表指針錯誤排查:常見段錯誤原因分析

     編輯:C 語言問答

鏈表程式運行崩潰典型原因

代碼實現單鏈表建立與遍歷,運行到末尾出現錯誤,典型指針問題。

代碼問題分析

struct student *cin(void) {
    struct student *head, *p1, *p2;
    head = p2 = p1 = (struct student*)malloc(N);
    scanf("%d", &(*p2).num);
    while ((*p2).num != 0) {
        p1 = (struct student*)malloc(N);
        scanf("%d", &p1->num);
        if (p1->num == 0) break;
        (*p2).next = p1;
        p2 = p1;
    }
    p1 = NULL;          // 問題1:p1 指向 NULL
    (*p2).next = 0;     // 問題2:p2 可能是最後一個有效節點,next 設為 0 正確
    return head;        // 但 head 指向第一個節點,若第一個輸入即為 0 則 head 為垃圾值
}

關鍵缺陷

  1. 首節點處理邏輯錯誤:若首個輸入為0,head 指向已分配但未初始化的節點,且 num=0 導致列表為空但 head 非 NULL
  2. 迴圈結構混亂:p1 先分配再讀取,導致最後多分配一個節點
  3. 結束條件處理:輸入0時應釋放最後分配的節點,而非直接斷開

修正版建立函數

struct student *createList() {
    struct student *head = NULL, *tail = NULL, *newNode;
    int num;
    
    while (1) {
        scanf("%d", &num);
        if (num == 0) break;
        
        newNode = (struct student*)malloc(sizeof(struct student));
        newNode->num = num;
        newNode->next = NULL;
        
        if (head == NULL) head = tail = newNode;
        else {
            tail->next = newNode;
            tail = newNode;
        }
    }
    return head;
}

除錯建議

  • 使用 valgrind 或 VS 除錯器檢測記憶體錯誤
  • 每次 malloc 後檢查返回值是否為 NULL
  • 畫圖追蹤指針變化:head、tail、newNode、current
  • 測試邊界:空列表、單節點、多節點、輸入0結束

遍歷列印函數

void printList(struct student *head) {
    while (head != NULL) {
        printf("%d\n", head->num);
        head = head->next;
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved