当我尝试声明以下函数时
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]
?
答案 0 :(得分:4)
当我尝试声明以下功能时
等待!! 这不是一个函数,即typedef
- 一个结构,一个用户定义的类型。
那说,在第一种情况下,
typedef struct TRIE_NODE
{
char* word;
struct TRIE_NODE node[26]; //array of type struct TRIE_NODE
}TRIE_NODE;
如果必须这样做,编译器需要知道{/ 1>} 之前 的大小,这是不可能的。所以它无效。
另一方面,
struct TRIE_NODE
没问题,因为你正在为结构分配(数组)指针,那时编译器不需要知道结构的实际大小。因此,编译器愉快地分配指针,定义(构造)完全有效。
答案 1 :(得分:1)
要回答您自己的问题,请问:
将包含多少字节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
点。
答案 2 :(得分:1)
没有人提到这一点,但是如果允许struct拥有自己的成员或数组(不是指针,而是常规成员或数组),那么结构将是递归的并且具有无限大小,因为该成员将有一个成员在同一类型内部等等,直到无限。