为什么sizeof(IO_ERROR_LOG_PACKET)为48字节而非预期的44字节?
问题原因:结构体尾部对齐填充
你手动计算的成员累加大小44字节是正确的,偏差来自你遗漏了C语言结构体的整体对齐规则:
- 规则1:每个结构体成员的偏移量必须是自身对齐大小的整数倍(这部分你已经考虑到了,比如
EventCategory后加的2字节对齐填充) - 规则2:整个结构体的总大小必须是结构体内部最大基本数据类型成员对齐大小的整数倍,保证结构体作为数组元素时,数组内每个元素都能满足对齐要求,避免未对齐访问异常。
这个结构体里最大的基本类型成员是LARGE_INTEGER类型的DeviceOffset,它是64位整数,对齐要求为8字节。你计算得到的成员总大小44除以8余4,因此编译器会自动在最后一个成员DumpData[1]的末尾追加4字节的填充位,最终总大小为48字节,刚好是8的整数倍,符合默认对齐规则。
如果使用#pragma pack(1)强制关闭对齐,结构体大小会变为你计算的44字节,但Windows内核原生结构体默认使用自然对齐策略,因此实际大小为48字节。
内容的提问来源于stack exchange,提问作者Some name
相关产品推荐
相关产品推荐

