簡體   English   中英

為什么允許結構本身具有“指向其自身類型的指針”而不是成員本身(“結構類型的數組”)?

[英]Why a structure is allowed to have “pointer to its own type” as member but not “(an array of the) structure type” itself?

當我嘗試聲明以下功能時

typedef struct TRIE_NODE
{
    char* word;
    struct TRIE_NODE node[26];
}TRIE_NODE;

我收到以下錯誤:

直到結束“}”時,“ struct TRIE_NODE”的定義才完整

但是,如果我用指向26個節點的指針聲明此函數,則編譯就很好。

typedef struct TRIE_NODE
{
    char* word;
    struct TRIE_NODE* node[26];
}TRIE_NODE;

我可以想象,由於這不是實例,因此我不可能獲得指向這26個數組中第一個數組的指針,但是如果這是問題所在,那么TRIE_NODE* node[26]也不是問題嗎? 這個聲明不等於TRIE_NODE node[1][26]嗎?

當我嘗試聲明以下功能時

等待!! 這不是一個函數,這是typedef -ing的結構,一個用戶定義的類型。


也就是說,在第一種情況下,

typedef struct TRIE_NODE
{
    char* word;
    struct TRIE_NODE node[26];  //array of type struct TRIE_NODE
}TRIE_NODE;

如果必須這樣做,則編譯器需要在定義struct TRIE_NODE 之前知道其大小,這是不可能的。 因此無效。

另一方面,

typedef struct TRIE_NODE
{
    char* word;
    struct TRIE_NODE* node[26];  //array of pointers (of type struct TRIE_NODE)
}TRIE_NODE; 

很好,因為您正在分配指向結構的指針(的數組),所以此時編譯器不需要知道結構的實際大小。 因此,編譯器愉快地分配了指針,並且定義(構造)完全正確。

要回答您自己的問題,請詢問:多少字節

struct TRIE_NODE node[26];

占據? 實際上,您希望sizeof(struct TRIE_NODE)是什么?

原因

struct TRIE_NODE *node[26];

起作用的是,我們知道sizeof(struct TRIE_NODE*) 因為所有結構指針的大小都相同 ,所以即使它們的類型不完整,我們也可以分配N個結構指針的數組。

指針和數組幾乎不可以互換嗎?

指針和數組的語法相似。 您可以為指針下標,也可以添加到數組的地址。 但是他們定義了不同的東西。 基本上:數組保存數據,而指針保存地址。

在C標准庫的某些部分,您會發現定義如下的結構:

struct S {
    int len;
    char data[1];
};

您可能會想問為什么不使用指針?

struct Z {
    int len;
    char *data;
};

答案: struct S實際上大於它似乎占據的5個左右字節,並且數據部分在len之后立即開始。 在假定的struct Z示例中, data不是數據開始的; 數據將在其他任何地方,無論data 指向何處。

假設適當地初始化了結構,則在兩種情況下data[0]都將尋址數組的第一個字節。 它們在語法上相似。 但是內存布局不同。 S情況下,該字節將非常接近(char*)&len + sizeof(len) Z情況下,它將位於data點的任何位置。

沒有人提到這一點,但是如果允許struct擁有其自身的成員或數組(不是指針,而是常規成員或數組),則該結構將是遞歸的並且具有無限大小,因為該成員在同一個成員中還會有一個成員等等,直到無窮大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM