我有这段代码:
mbr.h:
^=
并且:main.c:
struct mbr_partition {
char flags;
char start_head;
char start_sector;
char start_cyl;
char type;
char last_head;
char last_sector;
char last_cyl;
uint32_t start;
uint32_t size;
};
struct mbr {
char bootloader[446];
struct mbr_partition partition1;
struct mbr_partition partition2;
struct mbr_partition partition3;
struct mbr_partition partition4;
char magic[2];
};
输出:
int main()
{
printf("%d\n", sizeof(struct mbr));
printf("%d\n", sizeof(struct mbr_partition));
printf("%d\n", sizeof(long));
struct mbr mbr;
printf("%d, %d\n", ((char *) &mbr.magic) - ((char *) &mbr), sizeof(mbr)$
printf("1: %d\n", ((char *) &mbr.partition1) - ((char *) &mbr));
printf("2: %d\n", ((char *) &mbr.partition2) - ((char *) &mbr));
printf("3: %d\n", ((char *) &mbr.partition3) - ((char *) &mbr));
printf("4: %d\n", ((char *) &mbr.partition4) - ((char *) &mbr));
return 0;
}
为什么大小是516字节(应该是512)? 为什么partition1偏移是448而不是446? 我该如何解决?
答案 0 :(得分:7)
因为可能有一些填充字节或填充位。
引自N1570 6.7.2.1 Structure and union specifiers
:(强调我的)
15在结构对象中,非位字段成员和单位 其中位字段驻留的地址按顺序增加 他们被宣布。适当地指向结构对象的指针 转换后,指向其初始成员(或者如果该成员是 位字段,然后到它所在的单元,反之亦然。 结构对象中可能有未命名的填充,但不是在开头。