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

C語言結構體自我引用:指標與直接嵌套的關鍵差異

     編輯:關於C語言

兩種宣告對比

A 版:正確(指標)

struct node {
    int a;
    float b;
    struct node *next;  // 指標:固定大小 4/8 位元組
} s;

B 版:錯誤(直接嵌套)

struct node {
    int a;
    float b;
    struct node next;   // 錯誤:無限遞迴定義
} s;

核心原因:編譯器需知類型大小

  • 宣告結構體時,編譯器必須計算其記憶體佈局大小
  • struct node *next:指標大小固定(32 位元 4 bytes,64 位元 8 bytes),編譯器可立即決定
  • struct node next:需知 struct node 完整大小,但此時結構體尚未定義完成 → 無限遞迴

延伸:任意結構體指標皆可

struct node {
    struct unknown *next;  // 正確:unknown 未定義也無妨
};

指標大小與指向類型無關,編譯器只需預留指標空間。

「甜餅機」比喻

  • 宣告 = 告訴編譯器「甜餅機」產出甜餅大小
  • 定義 = 甜餅機本身(完成設計)
  • B 版試圖在甜餅機未完成前,就用它生產甜餅放入機器內 → 邏輯悖論

實務應用:鏈結串列節點

struct ListNode {
    int data;
    struct ListNode *next;  // 唯一正確方式
};

此模式廣泛用於鏈結串列、樹、圖等動態資料結構。

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