一、结构体对齐
内存对齐:不管是结构体,还是普通的变量都存在内存对齐
规则:只能放在自己类型整数倍的内存地址上
简单理解:内存地址/占用字节=结果可以整除
举例:
int存放的位置:内存地址一定能被4整除
long long存放的位置:内存地址一定能被8整除
double存放的位置:内存地址一定能被8整除
结构体的内存对齐:
结构体在上面的基础上又多了一条,结构体的总大小,是最大类型的整数倍(用来确定最后一个数据补位的情况)
切记!!!
对齐的时候会补空白字节,但是不会改变原本字节的大小(char补位之后,本身还是1个字节)
例如:
typedef struct Student
{
char a;
int b;
short c;
};
在上述代码中,char类型本身占1个字节,int类型本身占4个字节,short类型本身占2个字节,加起来是7个字节,但是!!!!由于上述规则,正确的应该是------->
char类型占一个字节,放在内存地址为0的地方
int类型占4个字节,它只能放在4的整数倍上,所以放在内存地址为4,5,6,7的地方,1,2,3位置补齐
short类型占2个字节,它只能放在2的整数倍上,所以放在内存地址为8,9的地方
char,int,short中,最大类型是int占4个字节,结果只能是4的倍数,9不是4的倍数,10,11,12补齐,因此,最终占用12个字节!!!
二、指定对齐值
如果要指定对齐值,使用预处理指令#pragma pack(),使用代码如下:
#pragma pack(1)
typedef struct Student
{
char a;
int b;
short c;
}Student;
#pragma pack()
int main()
{
printf("%d\n", sizeof(struct Student));
return 0;
}