2012-07-26 39 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

相關問題