2016-04-02 2 views
2

У меня есть этот код:GCC генерирует неправильное смещение структуры почему?

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]; 
     }; 

И: 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; 
} 

И выход:

516 
16 
8 
512, 516 
1: 448 
2: 464 
3: 480 
4: 496 

Почему размер 516 байт (Это должно быть 512)? Почему смещение перегородки 448 не 446? Как я могу это исправить?

+0

Какой компилятор? – Macmade

+2

Я думаю, вам, возможно, придется добавить атрибут ** ** упакованный ** в структуру, чтобы удалить дополнительное дополнение. – Vikyboss

+1

Прокладка. См. Http://stackoverflow.com/a/18654110/12711 –

ответ

7

Потому что могут быть некоторые прописные байты или биты заполнения.

Цитируется N1570 6.7.2.1 Structure and union specifiers: (курсив мой)

15 В пределах объекта структуры, члены небитового поля и блоки , в котором битовые поля располагаются имеют адреса, которые увеличивают в порядке в котором они объявлены. Указатель на объект структуры, подходящим образом преобразованный , указывает на его исходный элемент (или если этот элемент является битовым полем , а затем к единице, в которой он находится) и наоборот. В объекте структуры может быть неназванное заполнение, но не в начале.

Смежные вопросы