为什么允许结构将 "pointer to its own type" 作为成员而不是“(结构类型的数组)”本身?

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;

我收到以下错误:

definition of 'struct TRIE_NODE' is not complete until the closing '}'

但是,如果我用指向 26 个节点的指针声明此函数,它编译得很好。

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

我想,因为这不是一个实例,所以我不可能得到指向这 26 个数组中第一个数组的指针,但如果那是问题所在,TRIE_NODE* node[26] 怎么也不是问题?这个声明不是等同于TRIE_NODE node[1][26]吗?

when i try to declare the following function

等等!! 这不是一个函数,那是 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];

works就是我们知道sizeof(struct TRIE_NODE*)的值。因为所有结构指针具有相同的大小,我们可以分配一个N结构指针数组,无论它们的类型如何,即使定义不完整。

aren't pointers and arrays almost interchangeable?

指针和数组的语法是相似的。您可以为指针添加下标,也可以添加到数组的地址。但他们定义不同的东西。基本上:数组保存数据,指针保存地址。

在 C 标准库的某些部分,您会发现这样定义的结构:

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

您可能会问为什么不使用指针?

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

答:struct S实际上比它看起来占用的5个字节大,数据部分紧接在len之后。在假定的 struct Z 示例中,data 不会 开始 数据;数据将在其他地方,无论 data points.

假设结构已适当初始化,在这两种情况下 data[0] 将寻址数组的第一个字节。它们在语法上相似。但是内存布局不同。在 S 的情况下,该字节将非常接近 (char*)&len + sizeof(len)。在 Z 的情况下,它将在任何 data 点。

没有人提到这一点,但如果结构允许拥有自己的成员或数组(不是指针,而是常规成员或数组),那么结构将是递归的并且具有无限大小,因为成员将有一个更多相同类型的成员等等,直到无穷大。