代碼嘗試在結構體內直接嵌套同類型陣列:
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 struct XML_DATA XML_DATA; // 允許在結構體內使用 XML_DATA*
// 或
typedef struct XML_DATA {
XML_DATA* DATA[10]; // 直接使用別名
...
} XML_DATA;
總結:結構體自引用**必須用指針**,不能直接包含實例。這是 C 語言類型系統的基本規則。