
✨个人主页: 熬夜学编程的小林
结构体
- struct tag
- {
- member-list;//成员列表
- }variable-list;//全局变量列表
- struct Stu
- {
- char name[20];//名字
- int age;//年龄
- char sex[5];//性别
- char id[20];//学号
- }; //分号不能丢
- #include <stdio.h>
- struct Stu
- {
- char name[20];//名字
- int age;//年龄
- char sex[5];//性别
- char id[20];//学号
- };
- int main()
- {
- //按照结构体成员的顺序初始化
- struct Stu s = { "张三", 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;
- }
- //匿名结构体类型
- struct
- {
- int a;
- char b;
- float c;
- }x;
- struct
- {
- int a;
- char b;
- float c;
- }a[20], *p;
- //在上⾯代码的基础上,下⾯的代码合法吗?
- p = &x;
- struct Node
- {
- int data;
- struct Node next;
- };
- struct Node
- {
- int data;
- struct Node* next;
- };
- typedef struct
- {
- int data;
- Node* next;
- }Node;
- typedef struct Node
- {
- int data;
- struct Node* next;
- }Node;
1. 结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较小值。3. 结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的整数倍。4. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。
- VS 中默认的值为 8- Linux中 gcc 没有默认对齐数,对齐数就是成员自身的大小
- //练习1
- struct S1
- {
- char c1;
- int i;
- char c2;
- };
- printf("%d\n", sizeof(struct S1));

1、根据结构体对齐的规则,结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处,即上图第一个绿色框。
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较小值。int 类型对齐数为4,VS默认对齐数为8,因此对齐到4的整数倍,即上图橙色方框。
3、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。char 类型对齐数为1,VS默认对齐数为8,因此对齐到1的整数倍,即上图蓝色方框。
4、结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的整数倍。最大对齐数为4,此时结构体大小9不是4的倍数,因此会再在多浪费3个字节(上图x是浪费的空间),因此大小为12字节。
- //练习2
- struct S2
- {
- char c1;
- char c2;
- int i;
- };
- printf("%d\n", sizeof(struct S2));

1、根据结构体对齐的规则,结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处,即上图第一个绿色框。
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较小值。char 类型对齐数为1,VS默认对齐数为8,因此对齐到1的整数倍,即上图橙色方框。
3、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。char 类型对齐数为1,VS默认对齐数为8,因此对齐到1的整数倍,即上图蓝色方框。
4、结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的整数倍。最大对齐数为4,此时结构体大小8是4的倍数,因此大小为8字节。
- //练习3
- struct S3
- {
- double d;
- char c;
- int i;
- };
- printf("%d\n", sizeof(struct S3));

1、根据结构体对齐的规则,结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处,即上图第一个绿色框。
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较小值。char 类型对齐数为1,VS默认对齐数为8,因此对齐到1的整数倍,即上图橙色方框。
3、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。int 类型对齐数为4,VS默认对齐数为8,因此对齐到4的整数倍,即上图蓝色方框。
4、结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的整数倍。最大对齐数为8,此时结构体大小16是8的倍数,因此大小为16字节。
- //练习4-结构体嵌套问题
- struct S4
- {
- char c1;
- struct S3 s3;
- double d;
- };
- printf("%d\n", sizeof(struct S4));

1、根据结构体对齐的规则,结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处,即上图第一个绿色框。
2、如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较小值。double 类型对齐数为8,VS默认对齐数为8,因此对齐到8的整数倍,即上图橙色方框。
3、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。char 类型对齐数为1,VS默认对齐数为8,因此对齐到1的整数倍,即上图蓝色方框。
4、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。int 类型对齐数为4,VS默认对齐数为8,因此对齐到4的整数倍,即上图绿色方框。
5、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。double 类型对齐数为8,VS默认对齐数为8,因此对齐到8的整数倍,即上图橙色方框。
6、结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。最大对齐数为8,此时结构体大小32是8的倍数,因此大小为32字节。
本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!