2012-10-24 52 views
-2
uint data1; 
ushort data2; 
ushort data3; 
uchar data4[8]; 

std::uint8_t buff[16]; 
std::uint8_t* out = buff; 

out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data1), 4, out); 
out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data2), 2, out); 
out = std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data3), 2, out); 

std::copy_n(quid.data4, 8, out); 

爲什麼會結果在out將是不同的,如果我不使用reinterpret_cast的std :: copy_n和reinterpret_cast的

+0

你真的應該顯示'quid'結構。否則這個問題真的沒有意義。即使如此,它讓我發抖。 – pmr

+0

爲什麼你刪除了關於小數位的問題?我幾乎完成了我的答案。 –

+0

我以爲我的問題是一個壞問題,我會重新打開它 – Guillaume07

回答

4

其結果將是不同的,因爲&x已鍵入T *,其中Tx的類型,指針運算把+ 1爲「由sizeof(T)推進指針」,這樣實際上你把一個指針的指針到該類型的元素數組。

如果更改指針的類型,您將把它指向的內存視爲不同類型的元素的數組 - 例如,將int視爲char的數組。

+0

是的,但即使我沒有reinterpret_cast使用int類型即sizeof將返回4,然後我傳遞計數參數= 1(而不是4),結果仍然會出錯 – Guillaume07

+1

@ Guillaume07:當然,但是將一個數字寫入一個字符(而不是在任何其他字符中寫入)並將許多個別字符寫入很多字符是有區別的。請記住'copy_n'在輸入和輸出迭代器上都做了'+ 1'! –

4
std::copy_n(&quid.data1, 4, out); 

作品彷彿quid.data1被宣佈爲uint data1[4]。結果是quid.data1被複制到out[0]out的3個其他元素得到垃圾。

std::copy_n(reinterpret_cast<std::uint8_t*>(&quid.data1), 4, out); 

對待data1內容作爲4個字符的陣列,這將如果sizeof(uint)==4工作。