我们知道C语言中的数据类型有基本类型,自定义类型,指针类型,今天我们重点说说自定义类型中的结构体。
为什么要有结构体?
我们在平时可能会定义一些相同的数据类型,比如 int, float,但我们在统计一个表的数据时,就显得捉襟见肘了,比如一个学生成绩表, 里面有不同的数据类型,所以就需要结构体了。
结构体的定义和初始化
struct stu{ char name[]; //姓名 int num; //学号 int age; //年龄 }sut1={"张三",20,18}; //其中struct stu就是一个自定义类型,就相当与int一样,这段代码的意思是定义并初始化了这样的结构体stu1
结构体的成员可以是数组,指针,甚至是结构体。
结构体中的内存对齐
首先看一下下面这个代码
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<Windows.h> struct S1 { char c1; int i; char c2; }; int main() { printf("%d\n", sizeof(struct S1));//结果为12 system("pause"); return 0; }
这个结果是不是和你想的不一样,这就要牵扯到结构体中的内存对齐问题了。
操作系统在访问内存时,并不是从任意字节开始访问,而是按照一定的规则从编址的某个字节读取一定的长度,内存必须按照这样的规则对齐。
规则:
1.结构体的第一个成员在偏移量为0的地址处。
2.其他成员对齐到 对齐数 整数倍地址处,对齐数= 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8, linux中的默认值为4。
3.结构体总大小为最大对齐数的整数倍。
附图解释:
为什么要有内存对齐
1.不是所有平台都能访问任意字节的地址,一些平台只能从特定长度开始访问。
2.提高访问效率,如果要访问为对齐的内存,就要在两个字节访问两次,然后拼接数据,这样效率极低。
如果内存对齐后,只需要一次访问,明显效率更快。