下面解释一下其中的几个结构体字节分配的情况
  比如对于node2
  typedef struct node2
  {
  char a;
  int b;
  short c;
  }S2;
  sizeof(S2)=12;
  对于变量a,它的自身对齐参数为1,#pragma pack(n)默认值为8,则终a的对齐参数为1,为其分配1字节的空间,它相对于结构体起始地址的偏移量为0,能被4整除;
  对于变量b,它的自身对齐参数为4,#pragma pack(n)默认值为8,则终b的对齐参数为4,接下来的地址相对于结构体的起始地址的偏移量为1,1不能够整除4,所以需要在a后面填充3字节使得偏移量达到4,然后再为b分配4字节的空间;
  对于变量c,它的自身对齐参数为2,#pragma pack(n)默认值为8,则终c的对齐参数为2,而接下来的地址相对于结构体的起始地址的偏移量为8,能整除2,所以直接为c分配2字节的空间。
  此时结构体所占的字节数为1+3+4+2=10字节
  后由于a,b,c的终对齐参数分别为1,4,2,大为4,#pragma pack(n)的默认值为8,则结构体变量后的大小必须能被4整除。而10不能够整除4,所以需要在后面填充2字节达到12字节。其存储如下:
  |char|----|----|----|  4字节
  |--------int--------|  4字节
  |--short--|----|----|  4字节
  总共占12个字节
  对于node3,含有静态数据成员
  typedef struct node3
  {
  int a;
  short b;
  static int c;
  }S3;
  则sizeof(S3)=8.这里结构体中包含静态数据成员,而静态数据成员的存放位置与结构体实例的存储地址无关(注意只有在C++中结构体中才能含有静态数据成员,而C中结构体中是不允许含有静态数据成员的)。其在内存中存储方式如下:
  |--------int--------|  4字节
  |--short-|----|----|    4字节
  而变量c是单独存放在静态数据区的,因此用siezof计算其大小时没有将c所占的空间计算进来。
  而对于node5,里面含有结构体变量
  typedef struct node5
  {
  bool a;
  S1 s1;
  double b;
  int c;
  }S5;
  sizeof(S5)=32。
  对于变量a,其自身对齐参数为1,#pragma pack(n)为8,则a的终对齐参数为1,为它分配1字节的空间,它相对于结构体起始地址的偏移量为0,能被1整除;
  对于s1,它的自身对齐参数为4(对于结构体变量,它的自身对齐参数为它里面各个变量终对齐参数的大值),#pragma pack(n)为8,所以s1的终对齐参数为4,接下来的地址相对于结构体起始地址的偏移量为1,不能被4整除,所以需要在a后面填充3字节达到4,为其分配8字节的空间;
  对于变量b,它的自身对齐参数为8,#pragma pack(n)的默认值为8,则b的终对齐参数为8,接下来的地址相对于结构体起始地址的偏移量为12,不能被8整除,所以需要在s1后面填充4字节达到16,再为b分配8字节的空间;
  对于变量c,它的自身对齐参数为4,#pragma pack(n)的默认值为8,则c的终对齐参数为4,接下来相对于结构体其实地址的偏移量为24,能够被4整除,所以直接为c分配4字节的空间。
  此时结构体所占字节数为1+3+8+4+8+4=28字节。
  对于整个结构体来说,各个变量的终对齐参数为1,4,8,4,大值为8,#pragma pack(n)默认值为8,所以终结构体的大小必须是8的倍数,因此需要在后面填充4字节达到32字节。其存储如下:
  |--------bool--------|    4字节
  |---------s1---------|    8字节
  |--------------------|    4字节
  |--------double------|    8字节
  |----int----|---------|    8字节
  另外可以显示地在程序中使用#pragma pack(n)来设置系统默认的对齐参数,在显示设置之后,则以设置的值作为标准,其它的和上面所讲的类似,不再赘述了,读者可以自行上机试验一下。如果需要取消设置,可以用#pragma pack()来取消。