为什么允许结构指向其自己的类型"作为成员而不是"(一个数组)结构类型"本身?

时间:2016-09-20 23:02:03

标签: c struct declaration definition

当我尝试声明以下函数时

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]

3 个答案:

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