## C语言中结构 struct 与联合 union 语法基本一致,如下以 struct 为例
一、struct 的基本用法
struct student
{
int num;
char* sex;
int age;
}; 结构体的声明与定义
struct student stu; 变量的声明与定义
stu.num = 0110;
stu.sex = "男";
stu.age = 20; 变量的使用
二、在声明结构体时同时定义变量
struct student
{
int num;
char* sex;
int age;
}stu = {0110, "男", 20}; 初始化部分可选
stu.num = 0110;
stu.sex = "男";
stu.age = 20; 变量的使用
三、使用 typedef 简化结构体类型名
typedef struct student 类型重定义
{
int num;
char* sex;
int age;
}student; 结构体的声明与定义
student stu; 变量的声明与定义
stu.num = 0110;
stu.sex = "男";
stu.age = 20; 变量的使用
四、结构体 struct 与 联合体 union 的区别
1、struct 中的成员是按顺序依次排列,互相独立,在排列时引入了对齐问题(*);
而union中的成员共用一块内存,起始地址都是相同的,即union中的成员是对同一地址的多个引用、对同一地址的多种表达方
2、对于union 的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct 的不同成员赋值是互不影响的。
五、内存对齐
1、什么是内存对齐?
································································
2、为什么要进行内存对齐?
平台原因(移植原因):
不是所有的硬件平台都能访问任意地址上的任意数据的;
某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
性能原因:
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
3、内存对齐规则?
在内存中,编译器按照成员列表顺序分别为每个结构体变量成员分配内存,当存储过程中需要满足边界对齐的要求时,编
译器会在成员之间留下额外的内存空间。如果想确认结构体占多少存储空间,则使用关键字sizeof,如果想得知结构体的某个特
定成员在结构体的位置,则使用offsetof宏(定义于stddef.h)。
数据成员对齐规则:结构 struct 或联合 union 的数据成员,第一个数据成员放在 offset 为 0 的地方,以后
每个数据成员的对齐按照 #pragma pack(n) 指定的数值和这个数据成员自身长度中,比较小的那个进行。
结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照
#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
结合1、2可推断:当 #pragma pack(n) 的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。