Почему фактический размер массива больше определенного?
Мне нужно узнать смещение до поля PPEB_LDR_DATA Ldr; структуры процесса PEB:
typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Reserved3[2];
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
PVOID Reserved4[3];
PVOID AtlThunkSListPtr;
PVOID Reserved5;
ULONG Reserved6;
PVOID Reserved7;
ULONG Reserved8;
ULONG AtlThunkSListPtr32;
PVOID Reserved9[45];
BYTE Reserved10[96];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved11[128];
PVOID Reserved12[1];
ULONG SessionId;
} PEB, *PPEB;
Если посчитать размер всех полей до поля Ldr, то это получается 20, но если я получаю размер через разность адресов (DWORD64)&(pPeb->Ldr)- (DWORD64)pPeb, то получаю 24. Как оказалось, поле BYTE Reserved2[1]; имеет размер не 1 байт, а 5 байт. Хотя если получать его размер так: sizeof(pPeb->Reserved2), то получается 1. И мне не совсем понятно такое несоответствие, когда поле структуры имеет размер 1 байт, а в памяти оно имеет размер 5 байт.
#include <iostream>
#include <Windows.h>
#include <winternl.h>
#include <string.h>
int main()
{
PTEB tebPtr = (PTEB)__readgsqword(offsetof(NT_TIB, Self));
PPEB pPeb = (PPEB)tebPtr->ProcessEnvironmentBlock;
std::cout << sizeof( pPeb->Reserved1) << std::endl;//2
std::cout << sizeof(pPeb->BeingDebugged) << std::endl;//1
std::cout << sizeof(pPeb->Reserved2) << std::endl;//1
std::cout << sizeof(pPeb->Reserved3) << std::endl;//16
std::cout << sizeof(pPeb->Ldr) << std::endl;//8
std::cout << (DWORD64) & (pPeb->Reserved3) - (DWORD64) & (pPeb->Reserved2) << std::endl;//5
system("pause");
return 1;
}