如上所示,将对其方式设为1字节对齐,那么S1不填充字节,sizeof为各元素所占字节之和即4。这一点在从外部2进制文件中读入struct大小的数据到struct中,是很有用的.
  另外,还有如下的一种方式:
  · __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照大成员的长度来对齐。
  · __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
  空结构体
  struct S3 { };
  sizeof( S3); // 结果为1
  “空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也只能为其分配一个字节的空间用于占位了。
  有static的结构体

 

struct S4{
char a;
long b;
static long c; //静态
};

  静态变量存放在全局数据区内,而sizeof计算栈中分配的空间的大小,故不计算在内,S4的大小为4+4=8。

 

struct S5{
char c;
int i;
};
struct S6
{
char c1;
S5 s;
char c2
};

  S5的宽简单成员的类型为int,S6在考虑宽简单类型成员时是将S5“打散”看的,所以S6的宽简单类型为int,这样,通过S6定义的变量,其存储空间首地址需要被4整除,整个sizeof(S6)的值也应该被4整除。c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补上3个填充字节。后得到sizeof(S6)的值为16。