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字节。