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 }
明明两个结构体的内容一样为什么它们所占内存的大小不一样呢?对就是结构体需要对齐的原因.
我们先看一下结构体对齐规则:你可能初次看有点懵,等会后面我会引出例子来讲解.规则:
a.结构体中的第一个成员在与结构体变量偏移量为0的地址处
b.其它成员变量要对齐到一个名叫对齐数的整数倍的地址处.补充:
对齐数=编译器默认的一个对齐数与该结构体中的成员变量大小中的较小值.我使用的是vs2022,默认对齐数为8.
c.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍.
d.如果存在了嵌套结构体的情况,嵌套的结构体则对齐到自己的成员变量中最大对齐数的整数倍处,包含该嵌套结构体的结构体大小为其成员变量(包含嵌套结构体)最大对齐数的整数倍
看到这里你应该懵了吧,没关系看例子
A.先看看上面的那个例子这是结构体1的
A.1这是结构体2的
B例子2
struct s3 { double d; char c; int i; }; int main() { printf("该结构体大小为%d字节\n",
sizeof(struct s3));//16 }
B.1这是该结构体内存图
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内存图
D.总结
记住要好好动笔哦,如果有什么问题欢迎评论区留言,点个赞吧,蟹蟹!