線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1681
推到 Plurk!
推到 Facebook!

offsetof計算問題

答題得分者是:AndrewK
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-28 15:00:21 IP:220.128.xxx.xxx 訂閱
http://www.soe.ucsc.edu/classes/cmpe225/Fall01/portest.txt

中有一段,

[code cpp]
DataLength = offsetof(PORT_WRITE_INPUT, CharData)
sizeof(InputBuffer.CharData);
[/code]
因為我不懂為什麼DataLength可以用offsetof的方式計算,做了下面的測試

[code cpp]
typedef struct _PORT_WRITE_INPUT
{
long PortNumber;

union
{
long LongData;
short ShortData;
char CharData;
};
int IntData;
} PORT_WRITE_INPUT;

PORT_WRITE_INPUT InputBuffer;
cout<<"offsetof(PORT_WRITE_INPUT, PortNumber) : "<<<"\tsizeof(InputBuffer.PortNumber)"<cout<<"offsetof(PORT_WRITE_INPUT, LongData) : "<<<"\tsizeof(InputBuffer.LongData)"<cout<<"offsetof(PORT_WRITE_INPUT, ShortData) : "<<<"\tsizeof(InputBuffer.ShortData)"<cout<<"offsetof(PORT_WRITE_INPUT, CharData) : "<<<"\tsizeof(InputBuffer.CharData)"<cout<<"offsetof(PORT_WRITE_INPUT, IntData) : "<<<"\tsizeof(InputBuffer.IntData)"<[/code]
得到結果如下:
offsetof(PORT_WRITE_INPUT, PortNumber) : 0 sizeof(InputBuffer.PortNumber)4
offsetof(PORT_WRITE_INPUT, LongData) : 4 sizeof(InputBuffer.LongData)4
offsetof(PORT_WRITE_INPUT, ShortData) : 4 sizeof(InputBuffer.ShortData)2
offsetof(PORT_WRITE_INPUT, CharData) : 4 sizeof(InputBuffer.CharData)1
offsetof(PORT_WRITE_INPUT, IntData) : 8 sizeof(InputBuffer.IntData)4
struct做一點更動
[code cpp]
typedef struct _PORT_WRITE_INPUT
{
long PortNumber;

long LongData;
short ShortData;
char CharData;
int IntData;
} PORT_WRITE_INPUT;
[/code]
得到結果如下:
offsetof(PORT_WRITE_INPUT, PortNumber) : 0 sizeof(InputBuffer.PortNumber)4
offsetof(PORT_WRITE_INPUT, LongData) : 4 (我以為是0 4) sizeof(InputBuffer.LongData)4
offsetof(PORT_WRITE_INPUT, ShortData) : 8 (我以為是4 4) sizeof(InputBuffer.ShortData)2
offsetof(PORT_WRITE_INPUT, CharData) : 10 (我以為是8 2) sizeof(InputBuffer.CharData)1
offsetof(PORT_WRITE_INPUT, IntData) : 12 (我以為是10 1=11?) sizeof(InputBuffer.IntData)4

因為第二個測試結果讓我對offsetof有點混亂,請問此原理是什麼?

謝謝
編輯記錄
GGL 重新編輯於 2009-08-24 14:20:59, 註解 無‧
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-29 02:27:50 IP:115.43.xxx.xxx 訂閱
測試環境:BCB 2006
加入這一行
改變 data alignment
[code cpp]
#pragma pack(1)
[/code]
結果就如您所預期的一樣
data alignment 我的預設值為 4
以下文章也可以參考
http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=98931
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
系統時間:2024-04-19 10:29:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!