Bu kodu vardır:GCC yanlış yapı ofset neden üretir?
mbr.h:
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];
};
Ve: main.c:
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;
}
Ve çıkışı:
516
16
8
512, 516
1: 448
2: 464
3: 480
4: 496
boyutu 516 bayt Neden (512 olmalı)? Neden bölüm1 ofseti 448 değil 446 değil mi? Nasıl düzeltebilirim? Bazı dolgu baytları veya dolgu bitleri olabileceğinden,
Hangi derleyici? – Macmade
Ekstra dolguları kaldırmak için yapıya ** paketli ** adlı özellik eklemeniz gerekebilir. – Vikyboss
Dolgu. Bkz. Http://stackoverflow.com/a/18654110/12711 –