两个独立的程序运行几乎相同的代码。我正在将一个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
这里到底发生了什么?
答案 0 :(得分:1)
您的错误是您硬编码float
大小为8,而可能是4。
因此,通过从缓冲区读取8个字节到浮点数来获得未定义的行为。
使用sizeof()
修复它,因为它正确返回4。