,介绍结构体类型,结构体变量的创建和初始化,重点介绍结构中存在的内存对齐,可以画图的形式讲解
一、结构体的创建和初始化
1.1结构体创建和初始化
结构体类型是一种构造数据类型。将多种数据类型“整合”在一起,构造出一种新的数据类型,以满足实际要求。比如描述学生:
这就创建了一个结构体,接下来是两种初始化:
int main(){// 按照结构体成员的顺序初始化struct Stu s1 = { " 张三 " , 20 , " 男 " , "20230818001" };printf ( "name: %s\n" , s.name);printf ( "age : %d\n" , s.age);printf ( "sex : %s\n" , s.sex);printf ( "id : %s\n" , s.id);// 按照指定的顺序初始化struct Stu s2 = { .age = 18 , .name = "lisi" , .id = "20230818002" , .sex = " ⼥printf ( "name: %s\n" , s2.name);printf ( "age : %d\n" , s2.age);printf ( "sex : %s\n" , s2.sex);printf ( "id : %s\n" , s2.id);return 0 ;}
1.2用typedef为结构体起别名
C语言中提供了关键字typedef为一个已存在的数据类型定义别名。因此,可用typedef为已定义的结构体类型定义别名。使形式上更加简洁。定义分为以下两种:
第一种
第二种
二、结构体大小
2.1结构体内存对齐
1.首先要了解对齐规则:
在 C 语言中,结构体是一种复合数据类型,其构成元素既可以是基本数据类型(如 int、long、float 等)的变量,也可以是一些复合数据类型(如数组、结构体、联合等)的数据单元。结构体对其规则主要有以下几点:
- 第一个数据成员放在 offset 为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如 int 在32位机为4字节,则要从4的整数倍地址开始存储)。
- 结构体变量的首地址一定是这个结构体变量中最大的基础(内置)类型的大小的整数倍。
- 结构体变量中每一个成员相对于结构体首地址的偏移一定是该成员的基础数据类型大小(对齐数)的整数倍。
1.VS 默认的对齐数为8,于该具体成员础数据类型大小相比较小为对齐数
2.Linux中 gcc 没有默认对齐数,对齐数就是成员本身的大小,
- 结构体变量的总大小一定是这个结构体变量中最大的基础类型的大小的整数倍。
- 如果允许修改默认对齐大小,则结构体变量的首地址一定是这个结构体变量中 Min(最大的基础(内置)类型的大小, 默认的对齐规则大小)的整数倍。
举例子:
struct s1大小为12,S2大小为8
2.修改默认对齐数
#pragma 这个预处理指令,可以改变编译器的默认对齐数。
2.2 为什么存在内存对⻬?
1. 平台原因 (移植原因):
2. 性能原因:
2.3结构体位段
那么他的大小是多少呢?
1.位段的内存分配
![](https://i-blog.csdnimg.cn/blog_migrate/38fd5c30cd19179d027d3dabd2a5573a.png)
4.位段中的成员在内存中从右到左的