錯誤程式碼
List initList() {
List L = (List)malloc(sizeof(struct LNode));
L->last = -1;
return 1; // 錯誤:回傳整數 1,非 List 指標
}
void main() {
List L;
initList(L); // 錯誤:傳遞未初始化指標,函數內部配置記憶體未回傳給呼叫端
createList(L);
}
根本原因
initList 回傳型別為 List (即 struct LNode*),但 return 1 回傳整數,編譯器可能警告但允許,執行時 L 獲得無效位址 0x1。
main 中 List L; 未初始化,呼叫 initList(L) 傳遞的是垃圾值,函數內部 malloc 配置的記憶體位址未傳回給 main 的 L。
修正版本
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int Position;
typedef struct LNode *List;
struct LNode {
int Data[MAXSIZE];
Position last;
};
// 正確:回傳配置好的指標
List initList() {
List L = (List)malloc(sizeof(struct LNode));
if (L) L->last = -1;
return L;
}
// 正確:接收回傳值
int main() {
List L = initList();
if (!L) { printf("初始化失敗\n"); return 1; }
printf("初始化成功\n");
// createList 需修改為接收 List 並回傳狀態
createList(L);
free(L); // 釋放記憶體
return 0;
}
createList 修正
void createList(List L) {
int n, i;
printf("請輸入元素個數: ");
scanf("%d", &n);
if (n > MAXSIZE) n = MAXSIZE;
for (i = 0; i < n; i++) {
printf("第 %d 個: ", i+1);
scanf("%d", &L->Data[i]);
}
L->last = n - 1;
printf("建立完成: ");
for (i = 0; i <= L->last; i++) printf("%d ", L->Data[i]);
printf("\n");
}
關鍵觀念
- C 語言參數傳遞為 值傳遞,函數內修改指標參數本身不影響呼叫端,必須回傳新指標或傳遞二級指標。
malloc 回傳 void*,轉型為目標指標型別。
- 動態配置記憶體必須配對
free,避免洩漏。