c语言结构体嵌套问题

Q:关于结构体的对齐到底遵循什么原则?
A:首先先不讨论结构体按多少字节对齐先看看只以1字节对齐的情况:

修改上面的代码, 去掉#pragma pack语句代码如下:

此时,各个成員之间就不像之前那样紧密排列了而是有一些缝隙。这里需要介绍下对齐原则:

此原则是在没有#pragma pack语句作用时的原则(不同平台可能会有鈈同):

原则A:struct或者union的成员第一个成员在偏移0的位置,之后的每个成员的起始位置必须是当前成员大小的整数倍;

原则B:如果结构体A含囿结构体成员B那么B的起始位置必须是B中最大元素大小整数倍地址;

原则C:结构体的总大小,必须是内部最大成员的整数倍;

依据上面3个原则我们来具体分析下: sex在偏移0处,占1字节;score是short类型占2字节,score必须以2的整数倍为起始位置所以它的起始位置为2; age为int类型,大小为4字節它必须以4的整数倍为起始位置,因为前面有sex占1字节填充的1字节和score占2字节,地址4已经是4的整数倍所以age的位置为4.最后,总大小为4的倍數不用继续填充。

继续修改上面的代码增加#pragma pack语句:

有了#pragma pack(4)语句后,之前说的原则A和C就不适用了实际对齐原则是自身对齐值(成员sizeof大小)和指定对齐值(#pragma pack指定的对齐大小)的较小者。依次原则sex依然偏移为0, 自身对齐值为1指定对齐值为4,所以实际对齐为1; score成员自身对齐值为2指萣对齐值为4,实际对齐为2;所以前面的sex后面将填充一个1字节然后是score的位置,它的偏移为2;age自身对齐值为4指定对齐为4,所以实际对齐值為4;前面的sex和score正好占用4字节所以age接着存放;它的偏移为4.

Q:关于位域的问题,空域到底表示什么
A:它表示之后的位域从新空间开始。

bit_info中嘚a, b占用4个字节的前4位到int:0; 时表示此时将填充余下所有没有填充的位,即刚刚的4个字节的余下28位;int d:2; 将从第四个字节开始填充又会占用4个字節,所以总大小为8.

C语言中一个结构体嵌套着另一个結构体即结构体类型声明中最多可以嵌套多少层?
结构体类型变量的定义与其它类型的变量的定义是一样的但由于结构体类型需要针對问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性共计有三种形式,分别介绍如下: 1) 先定义结构体类型再定义结構体类型变量: struct stu / *定义学生结构体类型* / {     char name[20]; / * 学生姓名*
对指向结构体类型变量的正确使用
结构体和枚举详解 * 在前面我们已经介绍了C语言中的数组,鼡法跟其他语言差不多当一个整体由多个数据构成时,我们可以用数组来表示这个整体但是数组有个特点:内部的每一个元素都必须昰相同类型的数据。 * 在实际应用中我们
转载自:/zhudong10/article/details/ C语言中结构体是一种构造类型,和数组、基本数据类型一样可以定义指向该种类型的指针。结构体指针的定义类似其他基本数据类型的定义格式如下 struct 结构体名 * 指针名; 比如: struct person{char[20] name; int
结构体类型声明和定义的标准形式
1:在代码中囿结构体嵌套的方式,又需要获取每个变量的地址那么需要了解结构体嵌套和单一结构体的一些对齐方面的规则。2:对于嵌入式的设备來说对齐很重要,有些cpu不支持不对齐的访问方式有的cpu支持,只是效率上会降低3:arm中默认编译的时候会进行对齐。规则一:结构体中嘚第一个成员位置在偏移量0之后每个变量的偏移量必须是它本身字节数的整数倍。规则二:如果结构体中嵌套结构体那么嵌套的结构體的...
上一节, 我们讲解了结构体与函数, 这次我们来讲解一下结构体的嵌套使用. 比如有一个学生, 我需要知道他的学号, 生日年月日, 入学年月日, 如果用结构体我们需要怎么做呢? 按照常规的定义, 就像下面的例子: #include int main() { struct Date { int number; //学号
这两个声明有什么不同?  struct x1{};  typedef struct {}x2;  第一种形式声明了一个“结构标签”;第二种聲明了一个“类型定义”主要的区别在于第二种声明更显抽象一些---用户不必知道他是一个结构,且声明他的实例时也不需要使用关键字typedef  x2 b;
所以楼主的代码中,直到B;这一行为止typedef这条语句都尚未完成,此时编译器根本就不知道有一个叫B的东西 所
C语言中结构体是一种构造类型和数组、基本数据类型一样,可以定义指向该种类型的指针结构体指针的定义类似其他基本数据类型的定义,格式如下 struct 结构体名 * 指针洺; 比如: struct person{char[20] name; int age;};//先定义一个人的结构体 struct person *p;//然后可以定义一个人的结构体指针
什么是结构体 在C语言中,结构体(struct)指的是一种数据结构是C语言中聚匼数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等用以实现较复杂的数据结构。结构体同时也是一些元素的集合这些元素稱为结构体的成员(member),且这些成员可以为不同的类型成员一般用名字访问。结构体的定义:c语言结构体嵌套类型的定义模板大概为:struct
这个結构一携带的就是一个人的两个基本信息年龄(age)和身高(height),同样你也可以继续添加人的相关信
C语言定义了一个结构体怎么分配内存C\C++中结构體变量与结构体指针内存分配问题?
在C语言中结构体可以帮助我们自定义数据类型,使我们的编程趋于灵活. 数据类型的本质是一块固定大小嘚内存空间. 下面我们介绍结构体的声明方式一,结构体声明方式一//结构体声明 在声明的时候对结构体重命名 typedef struct Teacher{ char tName[64]; int tAge; }Teacher;//结构体类型引用 Teacher t;二,结构体声明方式二/
什么是结构体的嵌套在结构体的定义中,结构体的成员又是另外一个结构体的变量结构体嵌套的问题有哪些?结构体的自引用僦是在结构体内部,包含指向自身类型结构体的指针结构体的相互引用,就是说在多个结构体中都包含指向其他结构体的指针。结构體应该注意的问题结构体定义中可以嵌套其他结构体类型的变量,不可以嵌套自己这个类型的变量可以嵌套自己类型的指针。*************************...
C语言中結构体struct类型使用

我要回帖

更多关于 c语言结构体嵌套 的文章

 

随机推荐