错误地使用std :: copy?

rig*_*717 3 c++ std

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

sizeofUi32: 4    
Result: 12 sizeofUi32: 17179869184
Run Code Online (Sandbox Code Playgroud)

我认为这个问题可能是由于std :: copy接受迭代器而不是指针,但是从我在这里得到的东西,

指针是一个迭代器

所以我的示例代码必须有一个简单的问题,我错过了.但我无法发现它.你能解释一下,这里有什么问题吗?

编辑1:

所以从我上心的答案,即反序列化的字节向量,如果我知道正确的顺序和类型在矢量存储的数据,我可以尽量避免使用的std ::复制和公正分配矢量值适当类型的变量.它有效,但它安全吗?

uint32_t a = v[4];
uint8_t b = v[8];
Run Code Online (Sandbox Code Playgroud)

小智 8

当前的问题是:

std::copy(&ui32, &ui32 + sizeof ui32, &v[4]);
                       ^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

&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);
Run Code Online (Sandbox Code Playgroud)