结构体类型
概念:
结构体是一些值的集合,这些值称之为成员变量。这些值可以是不同类型的变量
声明:
struct stu
{
char name[20];
int age;
}student;//需要有分号
在声明结构体时,可以不完全声明,如:
匿名结构体类型
struct
{
int a;
char b;
float c;
}x,*y;
struct
{
int a;
char b;
float c;
}a,b;
在上面的代码中,我声明了两个看似一样但都是匿名的结构体,但是注意, 编译器会把上面两个声明当作完全不同的两个类型
结构体变量的创建和初始化
struct stu
{
int age;
char name[20];
}zhangsan;//声明结构体类型并创建了变量zhangsan
struct stu lisi = {14,"lisi"};//定义变量lisi并初始化
struct p
{
int data;
sturuct stu;//结构体嵌套
stu zhangsan* next;//结构体指针
}wangwu = {15,{5,6},NULL};//初始化
也有以下初始化方式,这种方式允许不按照成员顺序初始化(C99)
struct zhangsan
{
int age;
char name[20];
};
struct zhangsan = {.age = 20,.name = "zhangsan"};//初始化
结构体内存对齐
先看下面这段代码
#include<stdio.h>
struct stu
{
char name[1];
int age;
}zhangsan;
int main()
{
printf("%zd ", sizeof(zhangsan));
return 0;
}
运行代码时我们会得到结果:
这就引出了内存对齐的概念
对齐的规则
1.结构体第一个成员对齐到相对结构体变量起始位置偏移量为0的地址处
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数 = 编译器默认对齐数与该成员变量大小的较小值
*关于编译器默认对齐数
VS中默认为8
Linux中没有默认对齐数,对齐数就是成员自身大小
3.结构体总大小为最大对齐数(结构体中所有对齐数中最大的)的整数倍
4.若嵌套了结构体,则结构体成员对齐到自己成员中最大对齐数的整数倍处,结构体整体大小就是最大对齐数(包含嵌套结构体中成员对齐数)的整数倍
现在我们可以为之前的代码做出解释: