阅读:1756回复:5
c/c++的奇怪问题(20分已给)
代码如下:
typedef struct _HEADER_DATA { ETHERNET_HEADER EtherHeader; union { struct { IP_HEADER IpHeader; }; struct { LLC_SNAP LlcSnap; IP_HEADER LlcIpHeader; }; }; }HEADER_DATA, *PHEADER_DATA; 结果很奇怪: sizeof(ETHERNET_HEADER) 为14; sizeof(LLC_SNAP) 为8; sizeof(IP_HEADER) 为60; sizeof(HEADER_DATA) 却不是14+8+60=82,而是84,多出了两个字节。 以下的代码也会出问题: PHEADER_DATA pData; 然后pData->IpHeader.***的成员变量都往后移了两个字节,也就是说用pData->IpHeader.ipProtocol得到的是pData->IpHeader.ipProtocol后面的pData->IpHeader.ipAddress了。 我怎么也找不原因,各位帮我查查吧,谢谢。 [编辑 - 5/17/04 by nicklezhang] |
|
沙发#
发布于:2004-05-15 21:16
这是结构对齐的问题,MS C编译器对结构编译时默认是4字节对齐的,VC++是8字节对齐,实际上当结构的成员不是4字节对齐时编译器会自动插入隐含的成员变量导致整个结构按照4字节对齐。由于你的EtherHeader是14字节,所以编译器在其后插入了2字节,导致你其它的结构到偏移都后移了
在定义与数据流相对应的结构时一定要注意该问题,对于你那个有可能包含LLC_SNAP的Ethernet packet,你应该分开定义数据结构,而不是用一个结构来代替。或者你可以修改编译选项。在VC6的project->Setting->C/C++->Category(Code Generation)->Struct member alignment里可以修改该值。 |
|
板凳#
发布于:2004-05-17 16:43
但是如果我改成4bytes或1byte对齐,那如果遇到象_IRP这样的结构,例如IO Manager传下来的Irp,岂不是和我的驱动程序中的用法冲突?谢谢
|
|
地板#
发布于:2004-05-17 16:45
我的意思是,IO Manager传下来的Irp是8byte对齐的,而在我的驱动程序编译选项中是1byte对齐,这样访问Irp中的成员变量时岂不就要出错?
|
|
地下室#
发布于:2004-05-17 22:38
呵呵,这个我也没试过
|
|
5楼#
发布于:2004-05-18 12:19
把所有的结构都设置成1byte对齐显然不是好主意
用#pragma pack(1) #pragma pack(pop) |
|