nicklezhang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-29
  • 最后登录2017-06-19
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望145点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1756回复:5

c/c++的奇怪问题(20分已给)

楼主#
更多 发布于:2004-05-15 18:37
代码如下:
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]
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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里可以修改该值。
nicklezhang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-29
  • 最后登录2017-06-19
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望145点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-05-17 16:43
但是如果我改成4bytes或1byte对齐,那如果遇到象_IRP这样的结构,例如IO Manager传下来的Irp,岂不是和我的驱动程序中的用法冲突?谢谢
nicklezhang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-29
  • 最后登录2017-06-19
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望145点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-05-17 16:45
我的意思是,IO Manager传下来的Irp是8byte对齐的,而在我的驱动程序编译选项中是1byte对齐,这样访问Irp中的成员变量时岂不就要出错?
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-17 22:38
呵呵,这个我也没试过
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2004-05-18 12:19
把所有的结构都设置成1byte对齐显然不是好主意
用#pragma pack(1)
#pragma pack(pop)
游客

返回顶部