为什么允许结构具有“指向其自身类型的指针”作为成员但不允许“(结构类型的数组)”本身?
当我尝试声明以下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拥有自己的成员或数组(不是指针,而是常规成员或数组),那么结构将是递归的并且具有无限大小,因为该成员将在其中具有一个或多个成员类型等等直到无穷大。