结构体大小计算需要满足的两条原则:
一、结构体成员的偏移量必须是成员大小的整数倍
二、结构体大小必须是所有成员大小的整数倍
#include <stdio.h>
#include <stdlib.h>
struct s1{
//一、结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何成员的整数倍)
char ch1; //1
char ch2;//1
int i;//4 遵循结构体运算法则的第一条,偏移量必须是成员大小的整数倍,逻辑偏移2。实际按照规则要偏移4
};
//二、结构体大小必须是所有成员大小的整数倍
struct s2{
char ch1;//1
int i;//4 +3
char ch2;//1 9不是所有成员的整数倍,+3.所以结构体大小为12
};
struct s3{
char ch;//0 0
int i;//0+1 4 (0+1,整数倍空三)
char str[12];//4+4 10 结构体大小为10+10
};
struct s4{
char ch;//0
int i;//4
struct s{
char ch1;//0
int j;//4
};//8
float f;
};
struct s5{
char ch;
int i;
union{
char ch1;
int j;
};
};
//#pragma pack(4) //指定向4对齐 最大是8
struct s6{
char ch;//0
int i;//4
float f;//8
double d;//12
};
#pragma pack(10)//我们指定的对齐值是10,最大为8,是否就向10对齐?不是,当指定对齐值大于自身对齐值时,向自身对其值对齐,
struct s7{
char ch;//0
int i;//4
float f;//8
double d;//12
};//24
int main()
{
printf("int %d\n",sizeof(int));
printf("float %d\n",sizeof(float));
printf("char %d\n",sizeof(char));
printf("double %d\n",sizeof(double));
printf("s1 %d\n",sizeof(struct s1));
printf("s2 %d\n",sizeof(struct s2));
printf("s3 %d\n",sizeof(struct s3));
printf("s4 %d\n",sizeof(struct s4));
printf("s5 %d\n",sizeof(struct s5));
printf("s6 %d\n",sizeof(struct s6));
printf("s7 %d\n",sizeof(struct s7));
system("pause");
return 0;
}