/*
如何计算无嵌套结构体的大小?
由于存储变量地址对齐的问题,计算结构体大小的3条规则:
1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)
2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)
3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)
*/
//结构体内存对齐
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(s1)); //12
struct S2 s2 = {0};
printf("%d\n",sizeof(s2)); //8
return 0;
}
//计算有嵌套结构体的大小?
struct S4
{
char c1;
struct S3 s3;
double d;
};
//printf("%d\n",sizeof(struct S4));
int main()
{
struct S4 s4;
printf("%d\n",sizeof(s4));//32
return 0;
}
结构体的总大小是最大字节数的整数倍
设计结构体如何节省空间 又满足对齐---1.让占用空间小的变量尽量集中在一起
2.设置默认对齐数为
/*
//设置默认对齐数为4
#pragma pack(4)
struct S
{
char c1;//1
//3
double d;//8
};
#pragma pack()
//取消设置默认对齐数
int main()
{
struct S s;
printf("%d\n",sizeof(s));//12
return 0;
}
//设置默认对齐数为1
#pragma pack(1)
struct S1
{
char c1;//1
//没有浪费的空间
double d;//8
};
#pragma pack()
//取消设置默认对齐数
int main()
{
struct S1 s;
printf("%d\n",sizeof(s));//9
return 0;
}
*/
#include <stddef.h>//196行的offsetof头文件
struct S
{
char c;
int i;
double d;
};
int main()
{
// offsetof();//用于计算结构体变量中的每个成员相对于结构体起始地址的偏移量
printf("%d\n",offsetof(struct S,c));//0
printf("%d\n",offsetof(struct S,i));//4
printf("%d\n",offsetof(struct S,d));//8
//offsetof()是一个宏
return 0;
}