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

C 語言順序表實現:initList 回傳值錯誤導致崩潰

     編輯:程式設計疑難解答

錯誤程式碼

List initList() {
    List L = (List)malloc(sizeof(struct LNode));
    L->last = -1;
    return 1; // 錯誤:回傳整數 1,非 List 指標
}

void main() {
    List L;
    initList(L); // 錯誤:傳遞未初始化指標,函數內部配置記憶體未回傳給呼叫端
    createList(L);
}

根本原因

  1. initList 回傳型別為 List (即 struct LNode*),但 return 1 回傳整數,編譯器可能警告但允許,執行時 L 獲得無效位址 0x1。
  2. 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,避免洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved