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

C 語言單向鏈表初始化:指標參數必須傳址 (二級指標) 的根本原因

     編輯:程式設計疑難解答

初學者常犯錯誤:void init(List w) 傳值,導致主程式的 list1 指標未被修改。正確做法是傳遞指標的指標 (或 C++ 參考)。

錯誤程式碼分析

typedef struct Node* List;
void init(List w) { // w 是 List 的副本 (一級指標)
    w = malloc(sizeof(struct Node)); // 修改副本指向新記憶體
    w->next = NULL;
}
int main() {
    List list1; // 未初始化,值不定
    init(list1); // 傳遞 list1 的值 (地址或垃圾值)
    // list1 仍指向原位置,未指向新節點 → 記憶體洩漏、野指標
}

正確做法:二級指標

void init(List* w) { // w 是 List* (二級指標)
    *w = malloc(sizeof(struct Node)); // 解參考修改主程式的指標
    (*w)->next = NULL;
}
int main() {
    List list1 = NULL; // 良習:初始化為 NULL
    init(&list1); // 傳遞 list1 的地址
    // list1 現在指向新節點
}

C++ 參考語法 (更直觀)

void init(List& w) { // 參考,別名
    w = new Node();
    w->next = nullptr;
}
int main() {
    List list1 = nullptr;
    init(list1); // 像傳值一樣呼叫,實則傳址
}

記憶體圖解

main: list1 ──────► NULL
                    │
init: w (copy) ─────┘  (傳值:無法修改 list1)

main: list1 ──────► NULL
                    │
init: *w ───────────► 新節點  (傳址:透過 *w 修改 list1 所指)

完整可編譯範例 (含插入、列印、釋放)

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node, *List;

void init(List* head) {
    *head = (List)malloc(sizeof(Node));
    (*head)->next = NULL; // 頭節點不存資料
}

void insertTail(List head, int val) {
    List p = head;
    while (p->next) p = p->next;
    List node = (List)malloc(sizeof(Node));
    node->data = val; node->next = NULL;
    p->next = node;
}

void printList(List head) {
    for (List p = head->next; p; p = p->next)
        printf("%d ", p->data);
    puts("");
}

void freeList(List head) {
    List p = head;
    while (p) {
        List tmp = p;
        p = p->next;
        free(tmp);
    }
}

int main() {
    List list;
    init(&list);
    insertTail(list, 10);
    insertTail(list, 20);
    insertTail(list, 30);
    printList(list); // 10 20 30
    freeList(list);
    return 0;
}

核心觀念

  • 函式要修改呼叫端的指標變數本身,必須傳遞該指標的地址 (二級指標) 或使用 C++ 參考。
  • 鏈表慣用「頭節點」 (dummy head) 簡化插入/刪除邏輯,頭節點不存有效資料。
  • 務必配對 malloc/free,避免記憶體洩漏。

理解指標傳遞機制,是掌握 C 語言動態資料結構的關鍵門檻。

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