首页
社区
课程
招聘
[分享]见鬼了,结构字节数出鬼了~~~
发表于: 2008-12-16 15:21 4154

[分享]见鬼了,结构字节数出鬼了~~~

2008-12-16 15:21
4154
struct RPCBIND
{
    BYTE VerMaj;
    BYTE VerMin;
    BYTE PacketType;
    BYTE PacketFlags;
    DWORD DataRep;
    WORD FragLength;
    WORD AuthLength;
    DWORD CallID;
    WORD MaxXmitFrag;
    WORD MaxRecvFrag;
    DWORD AssocGroup;
    BYTE NumCtxItems;
    WORD ContextID;
    WORD NumTransItems;
    GUID InterfaceUUID;
    WORD InterfaceVerMaj;
    WORD InterfaceVerMin;
    GUID TransferSyntax;
    DWORD SyntaxVer;
};

这个鬼结构我手工数来数去都是45h个字节,为什么sizeof出来是48h个字节?
有谁和我一样无聊,来数数看  

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
2
有一种东西叫做对齐
就是,向左看齐,向前看,报数
1 1 1 1 4 2 ...
#pragma pack(1)
2008-12-16 15:34
0
雪    币: 420
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
再不你将里面的每个成员都sizeof一下。。看哪一个多了。再找原因吧。。
2008-12-16 15:35
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
纯引用。



另外补充一下,在gcc中是用 __attribute__(packed) 来指示的。
2008-12-16 16:13
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
对齐 ??

我用汇编重写后
RPCBIND STRUCT
    VerMaj db ?;
    VerMin db ?;
    PacketType db ?;
    PacketFlags db ?;
    DataRep dd ?;
    FragLength dw ?;
    AuthLength dw ?;
    CallID dd ?;
    MaxXmitFrag dw ?;
    MaxRecvFrag dw ?;
    AssocGroup dd ?;
    NumCtxItems db ?;
    ContextID dw ?;
    NumTransItems dw ?;
    InterfaceUUID GUID <?>
    InterfaceVerMaj dw ?;
    InterfaceVerMin dw ?;
    TransferSyntax GUID <?>;
    SyntaxVer dd ?;
RPCBIND ENDS

就是45h个字节了,如果是对齐的问题,应该怎么搞??

在最后加三个 byte 上去吗?会不会影响结构中各个数值的取得?

如下:
RPCBIND STRUCT
    VerMaj db ?;
    VerMin db ?;
    PacketType db ?;
    PacketFlags db ?;
    DataRep dd ?;
    FragLength dw ?;
    AuthLength dw ?;
    CallID dd ?;
    MaxXmitFrag dw ?;
    MaxRecvFrag dw ?;
    AssocGroup dd ?;
    NumCtxItems db ?;
    ContextID dw ?;
    NumTransItems dw ?;
    InterfaceUUID GUID <?>
    InterfaceVerMaj dw ?;
    InterfaceVerMin dw ?;
    TransferSyntax GUID <?>;
    SyntaxVer dd ?;
    db ?
    db ?
    db ?
RPCBIND ENDS
2008-12-16 16:54
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你看看编译器构造,就是48个字节 结构体的字节数 不是按里面的变量字节数相加
2009-5-18 17:24
0
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
7
有人挖坟, 我也无聊一把. 看看多出的这三个字节在哪里, 顺便理解一下什么叫对齐.
struct RPCBIND
{
	/* 00 */ BYTE VerMaj;
	/* 01 */ BYTE VerMin;
	/* 02 */ BYTE PacketType;
	/* 03 */ BYTE PacketFlags;
	/* 04 */ DWORD DataRep;
	/* 08 */ WORD FragLength;
	/* 0A */ WORD AuthLength;
	/* 0C */ DWORD CallID;
	/* 10 */ WORD MaxXmitFrag;
	/* 12 */ WORD MaxRecvFrag;
	/* 14 */ DWORD AssocGroup;
	/* 18 */ BYTE NumCtxItems;
	/*    */ BYTE fill1;
	/* 1A */ WORD ContextID;
	/* 1C */ WORD NumTransItems;
	/*    */ WORD fill2;
	/* 20 */ GUID InterfaceUUID;
	/* 30 */ WORD InterfaceVerMaj;
	/* 32 */ WORD InterfaceVerMin;
	/* 34 */ GUID TransferSyntax;
	/* 44 */ DWORD SyntaxVer;
};
2009-5-18 22:02
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在系统中要求4字节对齐,而在windows系统中要求更加严格,不仅4字节对齐,还有求每个变量开始的位置是其所占字节数的整数倍。
2009-5-18 23:30
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
对齐问题,我当时写的时候也是搞不明白。
2009-5-19 11:24
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
大众的声音已经表明了——就是字节对齐的问题。
lz可以自己去google搜一下,有很多的。。。
2009-5-19 20:02
0
游客
登录 | 注册 方可回帖
返回
//