2012-10-24 32 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工作。