先用代码说话:spa
#include<stdio.h> union union_data0{ int a ;//自己占用4个字节 char b ;//自己占用1个字节 int c ; }; union union_data1{ short a;//自己占用2个字节 char b[13];//自己占用13个字节 int c ;//自己占用4个字节 }; struct struct_data{ int a ;//int自己占用4个字节,偏移量为0 char b ;//char自己占用1个字节,偏移量为4 int c ;//1.暂时偏移量为5,编译器会判断出5不是4的整数倍,会在b的后面填充3个字节,最后c的偏移量为8,使得c的偏移量为c自己大小的整数倍;2.如今整个结构体大小暂时为12,编译器会判断12是否是其最大成员的整数倍,会在c末尾填充为整数倍,最后得出结果为12 }; int main(int argv,char* args[]) { printf("%lu\n",sizeof(union union_data0)) ; printf("%lu\n",sizeof(union union_data1)); printf("%lu\n",sizeof(struct struct_data)) ; return 0; }
结果:设计
[xx@localhost cdemo]$ gcc union_struct_space.c -o union_struct_space.out [xx@localhost cdemo]$ ./union_struct_space.out 4 12 16
机构体(struct)code
计算公式: space(struct)=最后一个成员的偏移量+最后一个成员数据类型的大小+末尾填充字节数(公式1)blog
原则:编译器
公用体(union),是个结构,他的全部的成员相对于基地址的偏移量都为0,他的结构空间要大到足够容纳最“宽”的成员,而且对齐方式要适合于全部公用体中全部类型的成员。也就是说博客
上面的公式(公式1)也是适用的。io
计算公式: space(union)=max(成员的偏移量)+某位填充字节编译
简单的原则:max(成员的偏移量)要整除各个成员,若不能整除,在最后的成员的后面字节填充。程序设计
注:此处偏移量:机构中某个成员的实际地址离其结构的首地址的距离。class
引出问题:
参考:C程序设计语言(第2版),慕课网之LinuxC语言结构体(鸣谢)
本人第一次写博客,限于能力有限,不免错漏,请各位大神多多包涵,不吝赐笔,勘误指正。