2016-04-02 22 views
2

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,

+0

Hangi derleyici? – Macmade

+2

Ekstra dolguları kaldırmak için yapıya ** paketli ** adlı özellik eklemeniz gerekebilir. – Vikyboss

+1

Dolgu. Bkz. Http://stackoverflow.com/a/18654110/12711 –

cevap

7

. N1570 6.7.2.1 Structure and union specifiers Alıntı

: Bir yapısı nesne içinde (vurgu benim)

15, sigara bit alan üyeleri ve birim olan bit-alanlar için artış adresleri ikamet içinde ilan edildi. Bir yapı nesnesine bir işaretçi, uygun olarak dönüştürülmüş , ilk üyesine işaret eder (veya bu üye bir bit alanı ise, içinde bulunduğu birimdir) ve tersi. Bir yapı nesnesi içinde adlandırılmamış dolgu olabilir, ancak başlangıçta değil.