简单解析C语言结构体

来源:互联网 发布:软件项目维护费用 编辑:程序博客网 时间:2024/05/18 19:22

1.结构体的定义
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。在C语言中,结构体指的是一种数据结构。
声明一个结构体类型的一般形式如下:

   struct  结构体名   {       成员表列   } ;
具体声明如下所示:
struct Struct{   int num;          //学号为整型`   char name[20];    //姓名为字符串   char sex;         //性别为字符型   int age;          //年龄为整型   float score;      //成绩为实型   char addr[30];    //地址为字符串};                   //注意最后一个有分号

注意:结构体类型的名字是又一个关键字struct和结构体名组合而成的(例如struct Student)。结构体名由用户指定的。
说明:
(1)结构体类型并非一种,而是可以设计出多种,例如struct Teach等,各自包含不同的成员。
(2)成员可以属于另一个结构体类

*定义结构体类型变量:*
(1)先声明界结构体的类型,再定义该变量的类型
struct Student(结构体类型名)
student1,student**2(结构体变量名)
(2)在声明类型的同时定义变量

struct  结构体名{    成员表列} 变量名表列;   

(3) 不指定类型名而直接定义结构体类型变量

struct{    成员表列} 变量名表列;

2 结构体总大小
我们在计算结构体的总大小的时候依据对齐原则。

a.对齐原则
(1)结构体的第一个成员永远放在0偏移处
(2)从第二个成员开始都要对齐到某个对齐数的整数倍处(对齐数为结构成员自身大小和默认对齐数的较小值。在vs平台上默认对齐数为8,在linux上默认对齐数为4)
注:默认对齐数可以被修改,利用 #pragma pack(修改后的字节数),就可以对当前平台的对齐数进行修改。
(3)结构体的总大小必须是默认对齐数的整数倍
(4)如果镶嵌了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
举例如下:

struct S{                // 对齐数    char c1;     // 1(自身大小为1,默认对齐数为8,取较小值0偏移处开始    int a;       // 4(自身4,默认8,取4)4偏移处开始算起    double d;    // 8(自身8,默认8,取8)8偏移处开始算起    char c2;     // 1(自身1,默认8,取1)16偏移处开始算起};//结构体总大小为24

分析:
画图如下

由此可见对齐有点浪费空间,那么为是么还要对齐嘞?这就有以下两个方面的原因了
b 对齐原因
1 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的,某些平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2 性能原因:数据结构(尤其是栈)应该尽可能的在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要做两次内存访问;而对齐的内存访问仅需要一次访问。

 这次就先简单写到这,分析介绍的比较浅,下次会继续努力,加油。fighting !
原创粉丝点击