C语言结构体若没有特殊定义,大小都是按照结构体中最大的元素为单位来计算的例如
typedef struct _A
{
int a;
char b;
}A;
A结构体大小为8字节
若想不按照此规则来定义结构体大小,也就是结构体每个元素占用了多大实际结构体占用大小就是元素的总和的话,则需要在结构体前后加上
#pragma pack(push)
#pragma pack(1)
typedef struct _A
{
int a;
char b;
}A;
#pragma pack(pop)
这样,A结构体的大小就为5字节。
那么请看如下两个结构体,你们认为大小分别是多少呢?
typedef struct _B
{
int a;
short b;
int c;
char d;
}B;
typedef struct _C
{
int a;
short b;
char c;
int d;
}C;
答案是,sizeof(B) = 16 , sizeof(C) = 12,这就涉及下一个规则,虽然B和C类型的结构体成员一样,但是由于排列顺序不同,short型和char型因为都没有到一个int的大小,加起来也没有超过一个int的大小,所以若这两个类型连起来定义,会自动为这两个类型分配一个int的大小也就是4字节。若没有连起来定义,当然还是各自分配一个4字节大小。