std::copy 的使用错误?

2024-05-12

这是一个简单的测试程序,说明了我遇到的问题:

#include <iostream>
#include <stdlib.h>
#include <inttypes.h>
#include <vector>

using namespace std;
typedef unsigned char Byte;

int main( )
{
    uint32_t ui32 = 12;
    size_t sizeofUi32 = sizeof ui32;
    cout << "sizeofUi32: " << sizeofUi32 << endl;
    vector<Byte> v(10);
    std::copy(&ui32, &ui32 + sizeof ui32, &v[4]);

    uint32_t result = 0;
    std::copy(&v[4], &v[4] + sizeof ui32, &result);

    cout << "Result: " << result << " sizeofUi32: " << sizeofUi32 << endl;

    return 0;
}

output:

sizeofUi32: 4    
Result: 12 sizeofUi32: 17179869184

我认为这个问题可能是由于 std::copy 接受迭代器而不是指针造成的,但是从我得到的结果来看here https://stackoverflow.com/questions/2728190/how-are-iterators-and-pointers-related,

指针是迭代器

因此,我的示例代码一定存在一个我遗漏的简单问题。但我看不出来。 您能解释一下,这里出了什么问题吗?

EDIT 1:

因此,从答案中我得到了这样的想法:要反序列化字节向量,如果我知道向量中存储数据的正确顺序和类型,我可以避免使用 std::copy 并将向量值分配给正确类型的变量。它确实有效,但安全吗?

uint32_t a = v[4];
uint8_t b = v[8];

眼前的问题就在这里:

std::copy(&ui32, &ui32 + sizeof ui32, &v[4]);
                       ^^^^^^^^^^^^^

&ui32有类型uint32_t *,并向其中添加任何内容已经考虑了对象的大小。您正在有效地尝试复制sizeof ui32 uint32_t对象,但你只有一个,所以你应该使用+ 1.

除此之外,使用std::copy使用不同类型的指针可能不会给您期望的结果。它的作用是v[4] = ui32;,只要ui32在里面Byte的范围,它就在这里,但这不是你一般可以依赖的东西。

第二std::copy存在大致相同的问题,但方向相反。

你可以做的是:

std::copy((Byte*) &ui32, (Byte*) (&ui32 + 1), &v[4]);
// or std::copy((Byte*) &ui32, (Byte*) &ui32 + sizeof ui32, &v[4]);
...
std::copy(&v[4], &v[4] + sizeof ui32, (Byte*) &result);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::copy 的使用错误? 的相关文章

随机推荐