c 中的结构:在结构本身中声明新变量

Posted

技术标签:

【中文标题】c 中的结构:在结构本身中声明新变量【英文标题】:structures in c : declaring the new variable in the structure itself 【发布时间】:2021-12-17 20:21:39 【问题描述】:

您能解释一下我们如何在结构本身中声明我们当前创建的变量吗?

typedef struct var var;
struct var 
       int a ;
       var b; ;

【问题讨论】:

您认为这种结构的尺寸是多少? 你不能。 error: field 'b' has incomplete type。您可以使用指针。 var *b;. 您可以创建一个指向同一类型的 pointer 成员,但显然 (?) 不是同一结构的另一个实例 - 这将是一个递归定义。 不,没有人可以解释这一点,原因与没有人可以解释如何在其内部存储一个盒子一样。 @dbush 刚刚尝试过,我认为 b 需要是指针才能正确存在大小? 【参考方案1】:

当你在结构中声明变量b

typedef struct var var;
struct var 
       int a ;
       var b; ;

struct var 类型仍然是不完整的类型。它的大小是未知的。所以编译器不知道要为数据成员b分配多少内存以及如何对齐结构内的数据成员。所以你不能这样声明一个对象。

来自 C 标准 (6.7.2.1 Structure and union specifiers)

8 结构声明列表的存在 struct-or-union-specifier 在翻译中声明一个新类型 单元。 struct-declaration-list 是一系列声明 结构或工会的成员。如果结构声明列表 不包含命名成员,不包含匿名结构,也不包含匿名 工会,行为未定义。 类型不完整,直到 紧跟在终止列表的 之后,并完成 此后

但是您可以使用指向struct var 类型对象的指针,因为指针始终是完整类型。例如

typedef struct var var;
struct var 
       int a ;
       var *b; ;

【讨论】:

是的,谢谢,但你能解释一下这个结构吗 @KenZa 什么不清楚? @Vlad_from_Moscow 它到底做了什么?如果我声明一个 var 类型的变量 x,我还需要输入一个整数和一个 var 类型的指针,这意味着这个指针将链接到另一个 var 变量? 抱歉我还是不习惯这个网站【参考方案2】:

在§6.7.2.1 Structure and union specifiers ¶3,C11 标准说:

结构或联合不应包含不完整或函数类型的成员(因此,结构不应包含自身的实例,但可能包含指向自身实例的指针)......

您正试图包含与您定义的结构相同类型的成员,该结构仍然是不完整的类型。这是一个“约束”,这意味着需要编译器来诊断问题。

此外,您提出的结构将需要无限量的存储空间,因为该结构包含一个int 和它自己的一个副本,其中包含一个int 和另一个它自己的副本,其中...

【讨论】:

如果 b 是指针,结构意味着什么 如果 b 是一个指针 (var *b;),那么您将拥有一个包含 int 和指向另一个相同类型结构的指针的结构——可以使用的东西例如,作为单链表的一部分。您可以在许多地方使用指向不完整类型的指针,它们提供了一种创建不透明类型的机制,其中类型内容的详细信息对客户端隐藏。在标准 C 中,FILE 类型是不透明的(尽管许多实现确实揭示了它包含的内容,以便可以使用这些内部结构编写宏)。 感谢您的回答

以上是关于c 中的结构:在结构本身中声明新变量的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体函数的返回值是结构体结构体变量中的信息

结构指针函数中未声明的变量 c

c语言结构体变量怎么比较大小假设p,e都是如下类型的结构体变量?

c 中结构体变量 如何在其他c文件中声明

C 语言结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

C语言之程序结构