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

C 語言鏈表動態記憶體分配失敗?常見錯誤與修正指南

     編輯:程式設計綜合問答

鏈表是 C 語言學習者接觸動態記憶體管理的經典案例,但 malloc 失敗、野指標、記憶體洩漏等問題層出不窮。本文針對常見錯誤提供診斷思路與修正範例。

典型錯誤場景

struct Node {
    int data;
    struct Node *next;
};

// 錯誤示範
struct Node *head = malloc(sizeof(struct Node));
head->data = 10;          // 未檢查 malloc 回傳值
head->next = NULL;        // 未初始化 next 指標
while (head->next) { ... } // 可能因未初始化導致死循環或段錯誤

三大核心問題

  1. 未檢查 malloc 回傳值:記憶體不足時回傳 NULL,直接解引用會崩潰
  2. 指標未初始化:next 指向隨機位址,遍歷時觸發未定義行為
  3. 缺乏退出條件:建立鏈表時無明確結束邏輯,導致無限分配耗盡記憶體

修正版範例

struct Node *create_node(int val) {
    struct Node *p = malloc(sizeof(struct Node));
    if (!p) {
        perror("malloc failed");
        return NULL;
    }
    p->data = val;
    p->next = NULL;          // 關鍵:初始化指標
    return p;
}

// 建立鏈表:以輸入 -1 為結束條件
struct Node *build_list() {
    int val;
    struct Node *head = NULL, *tail = NULL;
    while (scanf("%d", &val) == 1 && val != -1) {
        struct Node *node = create_node(val);
        if (!node) break;    // 分配失敗提前退出
        if (!head) head = tail = node;
        else {
            tail->next = node;
            tail = node;
        }
    }
    return head;
}

除錯檢查清單

  • ☑ 每次 malloc 後立即判空
  • ☑ 所有指標宣告時初始化為 NULL
  • ☑ 迴圈有明確終止條件(計數器、哨兵值、輸入結束)
  • ☑ 釋放記憶體時遍歷釋放每個節點,避免洩漏

進階建議

對於生產環境,建議封裝「安全分配器」統一處理錯誤、記錄日誌;大型專案可引入記憶體池減少碎片。學習階段務必養成「分配-檢查-初始化-使用-釋放」的完整習慣。

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