嵌套结构体问题。

struct s1
{
int x1;
struct s1 *x2; /*正确,成员是指针型变量,数据类型可以是本结构体*/
struct s1 *x3[6]; /*正确,成员是指针型,……可以是……*/
struct s1 x4; /*错误,成员是变量,不能是……*/
struct s1 x5[2]; /*错误,成员是数组,不能使……*/
};
注释不懂,是在解释语句的意思,还是在判断语句的意思。如果是判断,为什么是指针就正确?为什么是变量就错误?

注释是在解释那种写法是正确的,那种写法是错误的.

至于你说的,为什么指针就正确,变量就错误,是因为:

1,指针作为变量的时候,所占用的内存空间是固定的,不管这个指针是什么类型的,比如说
int *p1; //p1是一个指向整型的指针
float *p2; //p2是一个指向单精度类型的指针
double *p3; //p3是一个指向双精度类型的指针
但是,p1,p2,p3他们自身所占用的内存空间都是4字节的,
这里就涉及到指针这种特殊的类型,(指针本身占用的空间,和指针指向的空间,)

2,而当把这个结构体的本身作为自身变量的时候,你就无法知道这个变量具体占用的内存空间是多少,所以在给变量分配空间的时候就无法分配,所以说错误,
(就好比你定义一个数组,一定要指定这个数组有多少个元素,要不然计算机也没办法知道你这个数组到底需要多少内存空间,它就无法分配内存)
当结构体本身作为自身变量的时候,你计算一下,这个结构体所占用的内存空间,你看看你能计算出来吗?
直接进入死循环了,根本无法计算追问

明白了,又出现两个问题。
(1)struct s1
{
struct si *x2;
}
这个是不是说,x2里存放着struct s1,s1的内存是有限的?
(2)数组是不是同一道理?即数组里存放结构,结构里还是数组,所以导致死循环?

除了这两个问题,结构体的嵌套还有什么值得注意的地方么?

追答

(1)struct s1
{
struct si *x2;
}
这个是不是说,x2里存放着struct s1,s1的内存是有限的?

这个只是说你定义了一个指针,这个指针指向的空间类型是struct s1类型的结构体.struct s1类型的结构体占用的内存空间就是4字节,因为里面就一个指针类型的成员,所以占用空间上固定的.

2,
数组是不是同一道理?即数组里存放结构,结构里还是数组,所以导致死循环?

对,因为你这个数组里存放的是struct s1类型的结构体,而你这个结构体的大小是没办法知道的,

至于结构体的嵌套,个人觉得没什么特别注意的.
其他提醒你的是,对于结构体的认识,你把它就当作一普通的数据类型对待就行了.

比如说,int类型,在内存中占几个字节,这个是别人提前规定好的,你直接用就行.
而结构体只是你自己根据自己需要,自己定义了一个新的类型,这个新类型和int,float都是一种数据类型而已,因此结构体,数组等也被称作用户自定义类型.

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-23
我觉得注释的意思可能是告诉你这样子做是否正确,注释说的应该都是正确的,下面解释一下:
(1)为什么指针正确?
因为指针本事就是一个地址而已,在32位系统下是32位(也就是4字节),64位系统下是64位(也就是8字节),这些东西都是编译器在编译代码的时候就能够知道的,不同的指针只是说明这个指针指向的东西类型是不同的,对于这个结构体的空间大小分配没有影响
(2)为什么变量就不对?
这是因为这里使用的变量类型就是正在定义的变量类型,都是struct s1,编译器在编译到这里的时候需要知道这个变量的大小,但是这个变量的类型还没定义完,于是编译器就不知道该给这个变量分配多大的空间了,于是编译器就报错了
第2个回答  2012-08-23
这是C语言的语法规则,至于发明者为什么要这样制定规则:

如果有成员变量的话,一个结构体的实例的大小就会无穷大。比如:

struct s1 ss;

那么ss中就有一个结构体x4,而x4中也有一个结构体x4。。。

就这样一直下去,那么你的这个ss包含有无穷个此结构体变量,这是不可能0实现的。本回答被提问者和网友采纳
第3个回答  2012-08-23
解释:
如果是指针的话,指针里只不过是存放地址。地址会指向其它同一种类结构体。但它只是地址而已(只是16进制数,或者8进制数)。
如果是结构体类型变量或者数组的话,变量里存放的就应该是结构体。而这个结构体变量的结构体类型,就是它所在的结构体。。。这样就形成了同样的结构体嵌套,不管嵌套多少层,最里层的结构体中仍然定义了一个结构体,这就是所谓的递归(自己套用自己)。所以肯定会报错。
第4个回答  2012-08-23
问题是你的结构体里的结构体是自己,这会形成递归定义,即无穷递归,想想是不是

嵌套结构体问题。
2,而当把这个结构体的本身作为自身变量的时候,你就无法知道这个变量具体占用的内存空间是多少,所以在给变量分配空间的时候就无法分配,所以说错误,(就好比你定义一个数组,一定要指定这个数组有多少个元素,要不然计算机也没办法知道你这个数组到底需要多少内存空间,它就无法分配内存)当结构体本身作为自身变量的...

嵌套的结构体赋值的问题
这个问题跟外层结构成员或者嵌套结构成员无关。在用scanf函数输入数据的时候,需要把要赋值的变量的地址传给scanf函数。结构成员name是个数组,不带下标的数组名就是数组的地址,所以scanf("%s",c->name)是正确的。而嵌套结构的成员k是个整型变量,在输入的时候要在前面加上&来取得它的地址,所以要写成...

C语言 结构体的嵌套
classroom结构体包含student数组,表示班级和学生信息。结构体嵌套需考虑内存浪费和性能 结构体嵌套形成复杂数据结构,但需权衡嵌套程度和性能。学习嵌入式物联网时,正确路线和专业内容是关键。提供150多G学习资源,覆盖嵌入式物联网学习内容,免费领取,助力学习。

请教各位大侠,c语言结构体嵌套的问题、。
C语言实现不了你的想法。结构本身是没有值的,只有结构成员才有值。typedef struct{ float H;float L;float actual;}physic;typedef struct{ physic v;physic p;}thing;thing RTU;RTU.v.H=123.456;RTU.v.L=0;RTU.v.actual=100;

结构体的嵌套问题.
这个应该是OS系统对内存空间初始化的过程,主要是对内存空间进行分块操作,从代码中可以看到,其实每一个结构体就是一个为内存分的一个特定区域.不知道说的对不对,还请高手们指正一下.

嵌套结构体的赋值问题
刚开始创建List时系统为它分配了sizeof(List)大小的空间,但是里面的数据是垃圾数据,你可以手动给L赋值,方法非常简单,使用DOT(.)操作符,比如给s[0]赋值,就用L.s[0].sno = ;L.s[0].sname[0]等,每一级引用之间用DOT(.)连接,再通过赋值操作进行!

vb.net中嵌套结构体传值复制的问题
因为数组是引用类型,所以直接赋值会出现这种情况 可以在kb=k后单独复制数组 kb.rr=k.rr.Clone 这样两个数组就是独立的了 之所以先kb=k是为了当其含有多个成员时值型成员可以直接复制,只需Clone引用类型的就行了

【c语言共用体】里面嵌套有结构体,求详解。高分悬赏。谢谢
共用体就是享用同一块内存 在此例中 e的大小为最长元素的大小,也就是结构体out的大小,共两个int,假设此处int为4字节 e.c和e.d和e.out.a占用同一块内存,即低4字节的内存,a.out.b占用高4字节内存 然后e.c=1;e.d=2;e.c和e.d和e.out.a都为2 e.out.a=e.c*e.d = 2*2 =...

C语言结构体嵌套问题
我们定义一个新的结构体,就像定义一个新的数据类型一样,所以你的author和book都是一种结构体,而不是具体的变量,所以还要加一步(就像你第二个定义里面的struct author member一样):struct book books[N];后面用books这个数组变量就可以了(看你后面是想要个数组的)。

结构体可以嵌套定义吗
类定义中嵌套结构体是可以的,这里要分几种情况说明:对于已经声明的(在类外)结构体类型,在类定义内嵌套结构体变量,没有任何问题。在类定义内直接定义结构体类型并同时声明结构体变量,也是可以的,但这个结构体类型无法在类外使用。在类内只定义结构体类型,而不同时声明结构体变量是不可以的(这个...

相似回答