能力值:
(RANK:650 )
|
-
-
2 楼
有一种东西叫做对齐
就是,向左看齐,向前看,报数
1 1 1 1 4 2 ...
#pragma pack(1)
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
再不你将里面的每个成员都sizeof一下。。看哪一个多了。再找原因吧。。
|
能力值:
(RANK:260 )
|
-
-
4 楼
纯引用。
另外补充一下,在gcc中是用 __attribute__(packed) 来指示的。
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
你看看编译器构造,就是48个字节 结构体的字节数 不是按里面的变量字节数相加
|
能力值:
(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;
};
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
在系统中要求4字节对齐,而在windows系统中要求更加严格,不仅4字节对齐,还有求每个变量开始的位置是其所占字节数的整数倍。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
对齐问题,我当时写的时候也是搞不明白。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
大众的声音已经表明了——就是字节对齐的问题。
lz可以自己去google搜一下,有很多的。。。
|
|
|