初學者常犯錯誤: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 現在指向新節點
}
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;
}
malloc/free,避免記憶體洩漏。理解指標傳遞機制,是掌握 C 語言動態資料結構的關鍵門檻。