VC++ 6.0 結構定義大陷阱 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VC++ 6.0的安裝及使用C++
- Visual C++ 6.0的文件/視結構 (轉)C++
- 利用VC++獲取異構型資料庫庫結構資訊 (轉)C++資料庫
- 用VC++ 6.0製作網路自動測試程式 (轉)C++
- VC++ 6.0下OpenGL開發環境配置C++開發環境
- 在VC++ 6.0下利用訊息實現內部程式通訊 (轉)C++
- iOS 常用巨集定義大全iOS
- VC++實用巨集定義C++
- 讓VC++支援中文 (轉)C++
- WINDOWS 常用常量定義大全(不斷更新中)Windows
- VC++ 執行緒同步(轉)C++執行緒
- VC++/MFC 教程1(英文) (轉)C++
- VC++/MFC 教程2(英文) (轉)C++
- VC++/MFC 教程3(英文) (轉)C++
- VC++ 串列埠通訊(轉)C++串列埠
- VC++中STL的使用 (轉)C++
- Powerbuilder6.0實現 Browser/Server結構的Internet解決方案和工作方式 (轉)UIServer
- Platform SDK 中控制系統音量的重要結構MIXERCONTROLDETAILS結構體定義 (轉)PlatformAI結構體
- 更新win10系統後VC++ 6.0無法執行如何解決Win10C++
- PHP 陣列轉樹結構/樹結構轉陣列PHP陣列
- VC++ 的串列埠通訊 (轉)C++串列埠
- 用VC++編寫CGI程式 (轉)C++
- VC++控制檯程式中使用定時器C++定時器
- 萬維考試系統檢測不到VC++ 6.0環境解決辦法C++
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- XForms文件結構 (轉)ORM
- 資料結構學習(C++)——單連結串列(定義與實現) (轉)資料結構C++
- JavaScript 字串轉數字:陷阱(示例)JavaScript字串
- 定時中斷基本結構
- VC++/MFC 教程4&5(英文) (轉)C++
- VC++/MFC 教程6&7(英文) (轉)C++
- 再談Delphi vs VC++(非常精彩) (轉)C++
- VC++訊息對映的思考 (轉)C++
- 定製.NET 6.0的依賴注入依賴注入
- VC++基礎 連結串列的操作示例C++
- Oracle表結構轉換SqlSERVER表結構 指令碼OracleSQLServer指令碼
- 資料結構:順序結構和鏈式結構的資料型別定義資料結構資料型別
- oracle體系結構(轉)Oracle