2012-07-26 44 views
1

我得到了以下结构:对结构错误类型为int

struct Packet 
{ 
    short PacketSize; 
    short Type; 
}; 

struct SizeValidity 
{ 
    short SizeEnc; 
}; 

struct SendEncSecureCode 
{ 
    Packet header; 
    short EncSecurityToken; 
    int lTime; 
    SizeValidity ending; 
}; 

而且在我的代码,我想用sizeof操作符这样得到结构的大小:

SendEncSecureCode sendpacket; 
sendpacket.header.PacketSize = sizeof SendEncSecureCode; 

问题是我总是得到大小为0x10而不是0x0C,因此我将INT类型更改为DWORD,并且仍然是同样的问题,后来我尝试使用DWORD32并且仍然是相同的,编译器将它设置为8字节。我正在开发VC11 Beta,并且软件的目标是x86而不是x64。谢谢

+0

'的sizeof SendEncSecureCode'需要大约'SendEncSecureCode'括号,因为它的一种。如果这是编译,我建议改变它。 – chris 2012-07-26 04:49:17

+0

方括号结构名称周围给我错误,这不是一个变量... – ffenix 2012-07-26 04:51:35

+1

可能重复[结构填充和结构打包](http://stackoverflow.com/questions/4306186/structure-padding-and-structure-packing ) – 2012-07-26 04:52:03

回答

0

为了得到你期待的大小,你可以告诉编译器使用1个字节的包装:

#pragma pack(push, 1) 
struct Packet 
{ 
    short PacketSize; 
    short Type; 
}; 

struct SizeValidity 
{ 
    short SizeEnc; 
}; 

struct SendEncSecureCode 
{ 
    Packet header; 
    short EncSecurityToken; 
    int lTime; 
    SizeValidity ending; 
}; 
#pragma pack(pop) 

请参阅http://vcfaq.mvps.org/lang/11.htm

+0

请注意'#pragma pack是非标准的。 – 2012-07-26 06:18:15

+0

对于GCC,在结束括号和分号之间使用'__attribute __((packed))'。 – 2012-07-31 07:27:45

3

这被称为填充。编译器用零字节填充结构的不同成员之间的空间,以便更好地将这些成员与CPU可以更快地读取的地址对齐。您可以(但不应该,除非你有一个很好的理由)覆盖此行为与the pack pragma

#pragma pack(push, 0) 
struct {...}; 
#pragma pack(pop) 

这迫使填充这个结构是零个字节。你可以改变周围的零点。

+0

我该如何禁用?因为我需要的结构是大小0x0C ... – ffenix 2012-07-26 04:50:11

+0

请参阅修订答案。 – 2012-07-26 04:52:01

相关问题