浅谈 C 语言中的结构体【struct】与联合体【union】

版权声明: https://blog.csdn.net/qq_41880190/article/details/85276544

## 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值的大小将不产生任何效果。

猜你喜欢

转载自blog.csdn.net/qq_41880190/article/details/85276544