使用char缓冲区的c ++ memset / sizeof怪异

时间:2014-06-01 04:43:14

标签: c++ char buffer sizeof memcpy

两个独立的程序运行几乎相同的代码。我正在将一个int,enum和4个浮点数复制到一个unsigned char缓冲区中,然后将它们读回来以确保该过程是正确的。

第一个是一个简单的测试程序,可以找到here

它产生这个输出:

id: 10
o: 2
one: 1
two: 2
three: 3
four: 4
---
id: 10
o: 2
one2: 1
two2: 2
three2: 3
four2: 4

所以我想我自己,好吧......我可以把它转移到实际的程序中。主程序可以找到here。几乎一样吧?这是问题所在:从缓冲区读回变量:

id: 1
o: 1
p1x: 1
p1y: 2
p2x: 3
p2y: 4
---
id: 1
o: 1073741824
one: 3
two: 4
three: 2.76624e+19
four: 4

出于某种原因,随着值被读出... memcpy改变了多个变量的值,我最终搞砸了:

memcpy(&i2,&buffer[0],4);      //sets i2 correctly to 1
memcpy(&o2, &buffer[4],4);     //sets o2 correctly to DISTANCE (enum == 1)
memcpy(&one,&buffer[8],8);     //resets o2 to 1073741824 and one to 1
memcpy(&two,&buffer[16],8);    //sets two correctly to number 2, but one to 3
memcpy(&three,&buffer[24],8);  //sets three correctly to 3, but two to 4
memcpy(&four,&buffer[32],8);   //sets three to 2.766... and four to 4

std::cout << "id: " << i2 << std::endl;
std::cout << "o: " << o2 << std::endl;
std::cout << "one: " << one << std::endl;
std::cout << "two: " << two << std::endl;
std::cout << "three: " << three << std::endl;
std::cout << "four: " << four << std::endl;

更改memcpy以使用sizeof()修复它:

memcpy(&i2,&buffer[0],sizeof(i2));     
memcpy(&o2, &buffer[4],sizeof(o2));     
memcpy(&one,&buffer[8],sizeof(one));     
memcpy(&two,&buffer[16],sizeof(two));    
memcpy(&three,&buffer[24],sizeof(three));  
memcpy(&four,&buffer[32],sizeof(four));

----

id: 1
o: 1
p1x: 1
p1y: 2
p2x: 3
p2y: 4
---
id: 1
o: 1
one: 1
two: 2
three: 3
four: 4

这里到底发生了什么?

1 个答案:

答案 0 :(得分:1)

您的错误是您硬编码float大小为8,而可能是4。 因此,通过从缓冲区读取8个字节到浮点数来获得未定义的行为。

使用sizeof()修复它,因为它正确返回4。