這個問題在這里已經有了答案: 結構填充和包裝 (11 個回答) 12 小時前關閉。
typedef struct _IO_ERROR_LOG_PACKET {
UCHAR MajorFunctionCode; offset: 0 byte, size: 1 byte
UCHAR RetryCount ; offset: 1 byte, size: 1 byte
USHORT DumpDataSize ; offset: 2 byte, size: 2 byte
USHORT NumberOfStrings ; offset: 4 byte, size: 2 byte
USHORT StringOffset ; offset: 6 byte, size: 2 byte
USHORT EventCategory ; offset: 8 byte, size: 2 byte 2 byte for alignment
NTSTATUS ErrorCode ; offset: 12 byte, size: 4 byte
ULONG UniqueErrorValue ; offset: 16 byte, size: 4 byte
NTSTATUS FinalStatus ; offset: 20 byte, size: 4 byte
ULONG SequenceNumber ; offset: 24 byte, size: 4 byte
ULONG IoControlCode ; offset: 28 byte, size: 4 byte
LARGE_INTEGER DeviceOffset; offset: 32 byte, size: 8 byte
ULONG DumpData[1] ; offset: 40 byte, size: 4 byte
} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
; total = 44 byte
我預計sizeof(IO_ERROR_LOG_PACKET)是 44 個位元組。但是當我拆開它時,它竟然是48個位元組。有人知道為什么嗎?
uj5u.com熱心網友回復:
LARGE_INTEGER需要對齊到 8 位元組的邊界。成員在結構內對齊是不夠的,而且結構要對齊到 8 位元組也是不夠的。為此,將 sturct 填充為 8 位元組(否則您會遇到此類結構陣列的問題):
typedef struct _IO_ERROR_LOG_PACKET {
UCHAR MajorFunctionCode; 1 byte
UCHAR RetryCount ; 1 byte
USHORT DumpDataSize ; 2 byte
USHORT NumberOfStrings ; 2 byte
USHORT StringOffset ; 2 byte
USHORT EventCategory ; 2 byte 2 byte for alignment
NTSTATUS ErrorCode ; 4 byte
ULONG UniqueErrorValue ; 4 byte
NTSTATUS FinalStatus ; 4 byte
ULONG SequenceNumber ; 4 byte
ULONG IoControlCode ; 4 byte
LARGE_INTEGER DeviceOffset; 8 byte
ULONG DumpData[1] ; 4 byte 4 byte for alignment
} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
; total = 48 byte
請參閱https://en.cppreference.com/w/c/language/object#Alignment
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359878.html
上一篇:在單行上宣告來自普通變數的雙指標
