来解释为什么会有这种结果:
(1)
第二条可以知道,此时的对齐数是vs默认的8和int型4个字节取最小值,所以对齐数是4, 所以如果你放a,a放到4的整数倍的地址处
c2的对齐数为1和8取最小,故对齐数是1,放到1的整数倍地址处即可
目前来看只占了9个字节,但是第三条可以知道,结构体总大小为最大对齐数的整数倍,目前对齐数为1 4 1 最大对齐数为4,而9不是4的倍数,所以整个结构体大小为4的整数倍,12
(2)
同理,c1对齐数为1,c2对齐数为1,a的对齐数为4,当前所占8个字节,符合最大对其数的整数倍,所以打印输出为8
结果为16
对于结构体嵌套问题,可以参考第四条,由于s3所占16个字节,s3的最大对齐数为8,所以c1从1开始存,而s3从最大对其数的整数倍8开始存,存16个字节,d是从24字节开始放,放8个字节,总共是32个字节,同时结构体的最大对齐数为8,所以符合,最后输出32
所以在设计结构体的时候,就要既要满足对齐,又要节省空间,如何做到:
让占用空间小的成员尽量集中在一起
struct S
{
int a;
char c;
double d;
};
void Init(struct S* ps)
{
ps->a = 100;
ps->c = 'w';
ps->d = '3.14';
}
void Print(struct S tmp)
{
printf("%d %c %lfn",tmp.a,tmp.c,tmp.d);
}
int main()
{
struct S s;
Init(&s);//需要改变s,所以用了&
Print1(s);//不需要改变s
return 0;
}



