结构体对齐详解

1.结构体基础知识

a.认识结构体

结构体是一些值的集合,这些值称为成员变量.结构体的每个成员可以是不同类型的变量.

//声明一个结构体类型
//声明一个学生类型(Stu就是你对这个结构体的称呼)
struct Stu
{
	char name[20];
	char tele[12];  //成员变量
	char sex[10];
	int age;
}s4,s5,s6;//全局变量
struct Stu s3;//全局变量
int main()
{
	//创建结构体变量(局部的)
	struct Stu s1;
	struct Stu s2; 
}

b.结构体自引用

//结构体的自引用
typedef struct Node
{
	int data;
	//struct Node n; sizeof(struct Node)无限包含下去错误
	struct Node* next;//找到同类型的其它变量
}Node;//你只用关心这里就好了,我们给结构体创建了另一个名字

c.结构体嵌套使用

struct T
{
	double weight;
	int  age;
};
struct S
{
	char c;
	int a;
	double d;
	char arr[20];
	struct T st;//嵌套了上一个结构体
};

int main()
{
	struct S s = { 'c',100,3.14,"hello disposable",{55.6,20} };
	printf("%c %d %lf %s %lf %d\n", s.c, s.a, s.d, s.arr,s.st.weight,s.st.age);
}

 2.结构体对齐(重点)

//结构体内存对齐
struct s1
{
	char c1;
	int a;
	char c2;
};
struct s2
{
	char c1;
	char c2;
	int a;
};
int main()
{
	struct s1 s1 = { 0 };
	printf("声明的第一个结构体大小为%d字节\n", sizeof(struct s1));//12
	printf("该结构体变量大小为%d字节\n", sizeof(s1));//12
	struct s2 s2 = { 0 };
	printf("声明的第二个结构体大小为%d字节\n", sizeof(struct s2));//8
	printf("该结构体变量大小为%d字节\n", sizeof(s2));//8
}

结构体对齐详解_第1张图片

明明两个结构体的内容一样为什么它们所占内存的大小不一样呢?对就是结构体需要对齐的原因.

我们先看一下结构体对齐规则:你可能初次看有点懵,等会后面我会引出例子来讲解.规则:

a.结构体中的第一个成员在与结构体变量偏移量为0的地址处

b.其它成员变量要对齐到一个名叫对齐数的整数倍的地址处.补充:对齐数=编译器默认的一个对齐数与该结构体中的成员变量大小中的较小值.我使用的是vs2022,默认对齐数为8.

c.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍.

d.如果存在了嵌套结构体的情况,嵌套的结构体则对齐到自己的成员变量中最大对齐数的整数倍处,包含该嵌套结构体的结构体大小为其成员变量(包含嵌套结构体)最大对齐数的整数倍

看到这里你应该懵了吧,没关系看例子

A.先看看上面的那个例子这是结构体1的

结构体对齐详解_第2张图片

 A.1这是结构体2的

结构体对齐详解_第3张图片

  B例子2

struct s3
{
	double d;
	char c;
	int i;
};
int main()
{
	printf("该结构体大小为%d字节\n", sizeof(struct s3));//16
}

  B.1这是该结构体内存图结构体对齐详解_第4张图片

   C例子3

struct s2
{
	char c1;
	char c2;
	int a;
};
struct s3
{
	int  d;
	char c;
	int i;
	struct s2 t;//结构体嵌套
};
int main()
{
	printf("该结构体大小为%d字节\n", sizeof(struct s3));//20
}

  C.1内存图

结构体对齐详解_第5张图片

   D.总结

   记住要好好动笔哦,如果有什么问题欢迎评论区留言,点个赞吧,蟹蟹!

你可能感兴趣的:(c语言,开发语言)