nicklezhang
驱动牛犊
驱动牛犊
  • 注册日期2004-03-29
  • 最后登录2017-06-19
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望145点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1759回复: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]
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中的成员变量时岂不就要出错?
游客

返回顶部