目录
1、知识点的引入:
- struct data1
- {
- char a;//1B
- int b;//4B
- };
- void test01()
- {
- printf("%d\n",sizeof(struct data1));//8B 为啥?
- }

2、对齐规则(默认对齐)

第一步:确定分配单位(每行开辟多少字节)
结构体中最大的基本类型的长度 为分配单位。
第二步:确定成员的偏移位置。
偏移位置:成员自身类型的整数倍(0~n倍)
第三步:收尾工作:
结构体的总大小必须是分配单位的整数倍
- struct data
- {
- char c;//1B
- int i;//4B
- };
- void test05()
- {
- struct data d;
- //结构体的大小 >= 成员大小之和
- printf("%d\n",sizeof(struct data));//8
-
- printf("&d.c = %u\n",&d.c );
- printf("&d.i = %u\n",&d.i );
- }
运行结果:

案例:
- typedef struct
- {
- int a;
- char b;
- short c;
- char d;
- }DATA;
-
- void test06()
- {
- DATA d;
- printf("%d\n", sizeof(DATA));
-
- printf("%u\n", &d.a);
- printf("%u\n", &d.b);
- printf("%u\n", &d.c);
- printf("%u\n", &d.d);
-
- }

案例1:
- struct data1
- {
- char a;//1B
- int b;//4B
- };

案例2:
- struct data2
- {
- char a;
- short b;
- char c;
- int d;
- };

案例3:
- struct data2
- {
- char a;
- short b;
- short c;
- char d;
- };

案例4:
- struct data2
- {
- char a[7];
- short b;
- int c;
- };

第一步:确定分配单位(每行开辟多少字节)
所有结构体中最大的基本类型的长度 为分配单位。
第二步:确定成员的偏移位置。
普通成员偏移位置:成员自身类型的整数倍(0~n倍)
结构体成员的偏移量:该结构体的最大基本类型的整数倍
第三步:收尾工作:
结构体成员:是该结构体的最大基本类型整数倍。
结构体的总大小必须是分配单位的整数倍


案例:
- typedef struct
- {
- short d;
- char e;
- }DATA2;
-
- typedef struct
- {
- short a;
- int b;
- DATA2 c;
- char f;
- }DATA;
-
- void test08()
- {
- DATA data;
- printf("%d\n",sizeof(DATA));
-
- printf("a:%u\n", &data.a);
- printf("b:%u\n", &data.b);
- printf("c中d:%u\n",&data.c.d);
- printf("c中e:%u\n",&data.c.e);
- printf("f:%u\n",&data.f);
- }

案例:
- typedef struct
- {
- char a;
- int b;
- short c;
- }DATA;
- void test10()
- {
- DATA data={'a',100, 20};
- char *p = &data;
-
- printf("c = %hd\n", data.c);
- //需求 借助p访问20
- printf("c = %hd\n", *(short *)(p+8));
- }

运行结果:

案例:
- struct A
- {
- char b;
- short c;
- };
- struct B
- {
- int a;
- struct A ob;//结构体成员的偏移量
- int d;
- };

案例1:
- struct A
- {
- short b;
- char c;
- };
- struct B
- {
- int f;
- char a;
- struct A ob;//结构体成员的偏移量
- char d;
- };

#pragma pack (value)时的指定对齐值value
第一步:确定分配单位(每行开辟多少字节)
min(value,最大的基本类型的长度) 为分配单位。
第二步:确定成员的偏移位置。
偏移位置:成员自身类型的整数倍(0~n倍)
第三步:收尾工作:
结构体的总大小必须是分配单位的整数倍
- #include <stdio.h>
- #include<stdio.h>
- #pragma pack (4)
- struct stu
- {
- char a;
- short b;
- short c;
- };
- void test01()
- {
- printf("%d\n",sizeof(struct stu));//6
- }
注意事项:

- struct stu1
- {
- char a;
- int b;
- char c;
- int d;
- };

- #include <stdio.h>
- #include<stdio.h>
- struct stu1
- {
- char a;
- int b;
- char c;
- int d;
- };
-
- #define OFF_SET(TYPE, member) (int)&(((TYPE *)0)->member)
- void test01()
- {
- struct stu1 data;
- printf("偏移量:%d\n", OFF_SET(struct stu1, b) );//8
-
- }