C语言——结构体对齐

一、结构体对齐

内存对齐:不管是结构体,还是普通的变量都存在内存对齐

规则:只能放在自己类型整数倍的内存地址上

简单理解:内存地址/占用字节=结果可以整除

举例:
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值