为什么允许结构具有“指向其自身类型的指针”作为成员但不允许“(结构类型的数组)”本身?

当我尝试声明以下function时

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]吗?

当我尝试声明以下function时

等待!! 这不是一个函数,它是一个结构,一个用户定义的类型。


那说,在第一种情况下,

 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拥有自己的成员或数组(不是指针,而是常规成员或数组),那么结构将是递归的并且具有无限大小,因为该成员将在其中具有一个或多个成员类型等等直到无穷大。