结构体:
第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始,如:int( 在32位机中为4字节,64位机中为8字节)要从4或8的整数倍地址开始存储,需补齐。
struct A
{ // 所占内存大小
char ch; // 1+3
int a; // 4
} // 1+3+4=8
共用体(联合体):
各个成员以同一个地址开始存放,每一个时刻只可以存储一个成员,所以只需取占内存最大的作为联合体的大小。长度为联合体中元类型(如数组,取其类型的数据长度)最大的变量长度的整数倍,且要大于等于其最大成员所占的存储空间。
union B // 所占内存大小
{
char a; //1
int b[5];// 元长度:4 //4*5
double c; // 8
int d[3]; //元长度:4 //4*3
} //20+4
例:下面结构体
struct s1 // 所占内存大小 {
char ch,*ptr; // 1+3,4
union
{
short a,b; //(2,2
unsigned int c:2,d:1; //2,1)
}; //2+2
struct s1 *next; //4
};
sizeof(struct s1)的值 :1+3+4+2+2+4 = 16 字节