VC++ 6.0 結構定義大陷阱 (轉)

worldblog發表於2007-12-13
VC++ 6.0 結構定義大陷阱 (轉)[@more@]

VC++ 6.0 結構定義大陷阱!!!

本人寫一個,定義一個引數型別
typedef struct tagDef_Param
{
 char Name[64];
 bool Need;
 bool Neeuf;
 int Type;
}DEF_PARAM, *PRT_DEF_PARAM;

為了方便,所用的引數內容透過來維護,並透過VBA宏將引數內容寫入,然後再由VC。

為此本人在VBA中定義了一個結構

Type vbDef_Param
 Name  as string * 64
 Need   as byte
 NeedBuf as byte
 Type  as long
End Type

從MSDN中所描述的型別長度來計算VC中定義的結構長度應為70 = char(1) * 64 + bool(1) + bool(1) + int(4), VBA中定義的也應是70 = 64 + 1 + 1 + 4。
但實際結果卻不正確,在VC、VB中分別用以下程式碼得出的結果如下:

/* VC++ */
printf("Len=%d",sizeof(DEF_PARAM));
//輸出結果為Len=72

' VB
Dim Buf as vbDef_Param
Msgbox(Len(Buf))
'得到的結果是70

VC的結果比設想的多出了2個Byte,而VB卻正確?!

為了看看VC到底多在了那,又用以下程式測試了一下
/* VC++ */

 PRT_DEF_PARAM pDP = new DEF_PARAM;
 pDP->Need = 0;
 pDP->NeedBuf = 0;
 pDP->Type = -1;
 for(int I = 0; I < 64; I++)
 pDP->Name[I] = '*';

 CFile ;
 sf.open(......);
 sf.write(pDP, sizeof(DEF_PARAM);
 sf.close();

/*End*/

最後得到的結果竟然是讓人意想不到的,見下(UltraEdit 7.0):

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16
-----------------------------------------------
2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 
00 00 CD CD FF FF FF FF
-----------------------------------------------

VC自動在兩個bool型的成員後面新增了兩個Byte[CD CD],開始本人百思不得其解,在MSDN中也沒有找到有關此的內容,後來猜想是否在VC中定義結構其長度會補齊為4Byte的整數以適應32Bit的操作?於是我又進行了兩個測試
1:首先將將bool 型改為short 型,定義改為
typedef struct tagDef_Param
{
 char Name[64];
 short Need;
 short NeedBuf;
 int Type;
}DEF_PARAM, *PRT_DEF_PARAM;
得到的結果是正確的72


2:然後又將char 型的Name[64]陣列該為Name[10],定義改為
typedef struct tagDef_Param
{
 char Name[10];
 short Need;
 short NeedBuf;
 int Type;
}DEF_PARAM, *PRT_DEF_PARAM;
得到結果果然又不對了,應該是18Byte(144Bit),而實際結果是20Byte(160Bit)!

結論:
不知這是個的還是MSDN中有案可查屬於技術規定,但這種情況確實會給我們設計系統帶來了麻煩,特別是不同語言寫的程式碼之間傳送資料時(透過檔案或)很容易造成問題,而且非常不好查詢問題的出處。所以提醒大家在VC中定義用於資料的型別時總長度一定要定義成4Byte(32Bit)的倍數。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992812/,如需轉載,請註明出處,否則將追究法律責任。

相關文章