2013-03-25 3 views
0

я нашел такую ​​странную вещь: для структуры MasterBootRecordMVC 11.0 - Неправильный размер структуры?

// 

typedef unsigned char Byte; 
typedef unsigned short int Word; 
typedef unsigned int Dword; 

// 
typedef struct 
{ 
    Byte currentPartitionState; 

    Byte startPartitionHead; 
    Word startCylinderSector; 

    Byte partitionType; 

    Byte endPartitionHead; 
    Word endCylinderSector; 

    Dword numSectorsBetweenMbrAndPartition; 
    Dword numSectorsInPartition; 
} PartitionEntry; 

// 
typedef struct 
{ 
    Byte executableCode[446]; 

    PartitionEntry partitionEntry1; 
    PartitionEntry partitionEntry2; 
    PartitionEntry partitionEntry3; 
    PartitionEntry partitionEntry4; 

    Word bootRecordSignature; 
} MasterBootRecord; 

, когда я пытаюсь получить SizeOf (MasterBootRecord), я получаю 516 байт, хотя правильный размер составляет 4 + 446 * 16 + 2 = 512. Почему это может быть так ???

+1

Возможно, вам понадобится пакет #pragma – drescherjm

+1

's/right size/size, который * Я * думаю, что это должно быть, потому что я недостаточно образован, чтобы ответить на мой собственный вопрос /' –

+0

Или переупорядочить данные. Сначала введите разделы, затем bootRecordSignature, затем исполняемый код. –

ответ

1

Это из-за выравнивания данных в памяти.

Дело в том, что для хранения ваших 446 байт в 4-байтовых кусках вам потребуется 112 таких кусков, которые занимают 448 байт (на 2 байта больше, чем ожидалось). А для хранения последнего Word вам нужно также 4 байта вместо 2 (еще 2 байта). Таким образом, ваши 4 дополнительных байта.

Вы можете попробовать прокомментировать «bootRecordSignature», и вы должны получить еще 2 байта, чем ожидалось (ожидается 510, но вы получите 512).

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