C语言结构体对齐

C语言结构体对齐

今天又解码一个二进制文件,又遇到了问题,事情是这样的:读取一个字段,我用一个结构体来接收这些数,然后逐个处理,但结果却不对。我用二进制读取软件读取这个文件,与处理出来的结果对比发现:处理出来的数据竟然跳过一个4字节,也就是说,我处理出来的数据里面没有原始二进制文件中的对应的那4个字节。

师兄又来了,print一下结构体的大小,发现是40个字节,而我取的是36字节。多出来的4字节是哪里来的呢,这个时候师兄突然想到了结构体对齐这个东西。

先上一段我自己的代码:

struct C_TABLE
{
	unsigned int time_tag;
	int item2_3;
	int item4;
	int item5;
	unsigned int item6_14;
	int item15_19[2];
	long long item20_22;
};

逐个取,总共36字节,按理是没错的啊,但是结构体有一个对齐的东西需要注意。对齐的原因就是为了提高存取的效率。

如果将结构体比喻成一个长方形容器(容器的宽度为结构体中数据类型大小最大的值),我们往里放数据(也是长方形):
在这里插入图片描述接下来要放8字节的数的时候,这样放是不行的:
在这里插入图片描述只能这样放:
在这里插入图片描述那中间空着的是干嘛了呢?答案是自动存取了4字节的数据,导致多取了4字节的数据。
对齐很关键,需要留意。

举几个例子结束:

struct aa
{
	char a3;
	int a1;
	unsigned int a2;
};

这个结构体的大小是12字节。

struct aa
{
	int a1;
	unsigned int a2;
	long long a3;
};

这个结构体的大小是8字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值