为什么允许结构将 "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
点。
没有人提到这一点,但如果结构允许拥有自己的成员或数组(不是指针,而是常规成员或数组),那么结构将是递归的并且具有无限大小,因为成员将有一个更多相同类型的成员等等,直到无穷大。
当我尝试声明以下函数时
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
点。
没有人提到这一点,但如果结构允许拥有自己的成员或数组(不是指针,而是常规成员或数组),那么结构将是递归的并且具有无限大小,因为成员将有一个更多相同类型的成员等等,直到无穷大。