2013-05-01 107 views
1

有: 我必須聲明是這樣的:鑄造指針重用緩衝區

typedef struct 
{ 
    quint8 mark1; 
    quint16 content1; 
    quint16 content2; 
    quint8 mark2; 
}FrameHead; 

,並在功能上,我定義了一個緩衝區,看重它:

quint8 buf[40]; 
FrameHead *frame = (FrameHead *)buf; 
frame->mark1 = 0x68; 
frame->content1 = 0x3A; 
frame->content1 = 0x3A; 
frame->mark2 = 0x68; 

所以我想, buf的前6個字節應該是「68 3A 00 3A 00 68」。但事實是,buf的前8個字節是「68 90 3A 00 3A 00 68 80」。並且我使用了:

qDebug() << (quint8 *)(++frame) - buf// output "8" but should be "6" 

看似號「0x68」並沒有存儲爲quint8類型,但quint16類型保持一致與其他quint16 types.Anyone已經中遇到同樣的問題,並有任何建議。

回答

1

這是由於對齊。 16位類型在16位地址上對齊。由於您的第一個成員只使用8位,因此插入1個字節的填充。

如果你重新排列結構來

typedef struct 
{ 
    quint8 mark1; 
    quint8 mark2; 
    quint16 content1; 
    quint16 content2; 
}FrameHead; 

將只使用6個字節,因爲沒有填充需要對齊content1

有關更詳細的解釋,請參閱Structure padding and packing。評論後

編輯:

因此,無論您使用#pragma pack(1)(見:http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=VS.100%29.aspx)(不知道你

意味着設置對齊Qt中像 「#PRAGMA」 在VC」是什麼

)或只需使用一個數組:

typedef quint[6] FrameHead; 

.... 

FrameHead fh1 = {0x68, 0x00, 0x00, 0x00, 0x00, 0x68}; 
// or 
FrameHead fh2; 
memset(fh2, 0, sizeof(FrameHead)); 
fh2[0] = 0x68; 
fh2[5] = 0x68; 
+0

感謝johannes S.但我需要格式化「buf」。數據包的開始字節和結束字節應該是「0x68」,這就是爲什麼我將「contents1」,「contents2」插入結構的中間。現在你教會了我導致這個問題的原因應該是對齊的,有沒有在VC中像「#Pragma」一樣在Qt中設置對齊方式。 – wolfguolei 2013-05-01 15:11:35

+0

@wolfguolei,#pragma pack(1) – richselian 2013-05-01 15:18:27

+0

@richselian,thanks.it也在Qt工作。 – wolfguolei 2013-05-01 15:20:38