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

C語言動態內存管理與鏈表基礎(三):malloc/free、鏈表節點設計

     編輯:C 語言基礎

為什麼需要動態內存

數組長度編譯期固定,無法應對運行時才知道大小的場景(如學生人數不定)。動態內存管理函數在堆區按需分配/釋放內存,實現動態數據結構(鏈表、樹、圖)。

三大核心函數

函數原型功能返回值
mallocvoid *malloc(size_t size)分配 size 字節未初始化內存成功返回首地址,失敗返回 NULL
callocvoid *calloc(size_t n, size_t size)分配 n 個 size 字節塊,自動清零同 malloc
freevoid free(void *ptr)釋放 ptr 指向的堆內存無

使用模式


// malloc
struct Student *p = (struct Student*)malloc(sizeof(struct Student));
if (!p) { perror("malloc"); exit(1); }
p->num = 101; ...

// calloc:分配數組並清零
struct Student *arr = (struct Student*)calloc(10, sizeof(struct Student));

// free:用完必須釋放
free(p);
p = NULL;  // 防野指針

鏈表節點設計

每個節點 = 數據域 + 指針域。


struct Node {
    int num;           // 數據域:學號
    int age;           // 數據域:年齡
    struct Node *next; // 指針域:指向下一節點
};
  • next 指向同類型節點,形成遞歸結構。
  • 頭指針 head 指向首節點;末節點 next = NULL。
  • 可選頭節點(不存數據,僅存首節點地址),簡化邊界處理。

鏈表基本操作概覽

  1. 創建:循環 malloc 節點,串聯 next。
  2. 遍歷/查找:p = head; while(p) { ... p = p->next; }。
  3. 插入:修改前驅 next 指向新節點,新節點 next 指向後繼。
  4. 刪除:修改前驅 next 跳過目標節點,free 目標節點。

創建鏈表函數 create


#define NULL 0
#define TYPE struct Node
#define LEN sizeof(struct Node)

struct Node {
    int num, age;
    struct Node *next;
};

TYPE *create(int n) {
    TYPE *head = NULL, *pf = NULL, *pb = NULL;
    for (int i = 0; i < n; ++i) {
        pb = (TYPE*)malloc(LEN);
        printf("輸入學號 年齡: ");
        scanf("%d%d", &pb->num, &pb->age);

        if (i == 0) {
            pf = head = pb;  // 首節點
        } else {
            pf->next = pb;   // 串聯
        }
        pb->next = NULL;
        pf = pb;             // pf 移至尾部
    }
    return head;
}
  • pf (previous front) 始終指向已建鏈表的尾節點。
  • pb (previous back) 指向新分配節點。
  • 宏 TYPE/LEN 簡化代碼,非必需。

動態內存避坑指南

錯誤後果正確做法
不檢查 malloc 返回值NULL 解引用崩潰必須 if(!p) handle_error();
free 後不置 NULL野指針,二次 free、誤用free(p); p=NULL;
重複 free堆損壞,不可預測崩潰free 後置 NULL,免疫重複 free
釋放非 malloc 內存未定義行為只 free malloc/calloc/realloc 返回的指針
忘記 free(內存洩漏)長期運行耗盡內存所有權清晰,配對 malloc/free
柔性數組結構體 malloc 尺寸錯誤越界訪問malloc(sizeof(Struct) + n*sizeof(Elem))

總結

  • malloc/calloc 分配堆內存,free 釋放,三者配對使用。
  • 鏈表節點 = 數據域 + 指針域 (next),動態分配實現靈活增刪。
  • 創建鏈表核心:pf->next = pb; pf = pb; 尾插法。
  • 動態內存管理是 C 程序員核心基本功,誰分配誰釋放,所有權清晰。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved