/*

如何计算无嵌套结构体的大小?

由于存储变量地址对齐的问题,计算结构体大小的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;

}