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

C 語言結構體中引用自身類型:正確使用指針避免無限遞歸定義

     編輯:程式設計綜合問答

代碼嘗試在結構體內直接嵌套同類型陣列:

typedef struct XML_DATA {
    struct XML_DATA DATA[10]; // 錯誤:結構體大小無法確定(無限遞歸)
    ...
} XML_DATA;

錯誤原因

結構體定義時需要知道自身大小以計算成員偏移。直接包含自身類型(非指針)會導致無限遞歸:sizeof(XML_DATA) 需要 sizeof(XML_DATA),編譯器無法確定佈局,報錯「field has incomplete type」或「struct size unknown」。

正確做法:使用指針

typedef struct XML_DATA {
    struct XML_DATA* DATA[10]; // 指針陣列,大小固定 (10 * sizeof(void*))
    char MENU[10][256];
    ezxml_t xml;
    char *txt;
    char *strAttr;
    char *file;
} XML_DATA;

XML_DATA m_data[10]; // 正確:現在 XML_DATA 是完整類型
  • struct XML_DATA* 是完整類型(指針大小固定),編譯器可計算結構體大小。
  • 運行時動態分配子節點:m_data[0].DATA[0] = malloc(sizeof(XML_DATA));。

補充:typedef 別名簡化聲明

typedef struct XML_DATA XML_DATA; // 允許在結構體內使用 XML_DATA*
// 或
typedef struct XML_DATA {
    XML_DATA* DATA[10]; // 直接使用別名
    ...
} XML_DATA;

總結:結構體自引用**必須用指針**,不能直接包含實例。這是 C 語言類型系統的基本規則。

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