std :: copy:copy仅发生1个字节而不是指定长度

时间:2012-06-21 12:41:44

标签: c++

请参阅下面的代码段:

#include <iostream>
using namespace std;

int main()
{
uint32_t len, x;
char abc[] = "12345678";
uint8_t *ptr = (uint8_t *)abc;
copy(ptr, ptr + 4, reinterpret_cast<uint32_t*>(&len));
cout << " len: " << len << endl;
} 

输出为49!我希望输出为1234.我错过了什么

3 个答案:

答案 0 :(得分:5)

您的目标是长度为1的“容器”(即单个对象,len)。

您正在将四个后续字节值复制到此容器中,这当然会失败 - 特别是,它会导致溢出,因为目标只有一个元素的空间。

代码中的其他错误(不是详尽的列表):

  • 您会混淆字符代码及其字符串表示
  • 您正在执行多余演员

第一点特别相关,因为您实际想要做的是解析字符串的前四个字符中编码的数字作为十进制数字。但你实际做的是复制它的字符代码。

要用C ++解析数字,请使用std::stringstream或者,因为C ++ 11,std::stoi

答案 1 :(得分:1)

std:复制不能像你期望的那样工作。它将源'元素'复制到目标。因此,它将第一个uint8(= char'1'== 0x49,十六进制)复制到'len',然后继续跟踪内存中的三个随机uint32值。

这样就可以看到实际发生了什么。

#include <iostream>
using namespace std;

int main()
{
  uint32_t len[4];
  char abc[] = "12345678";
  copy(abc, &abc[4], &len[0]);
  cout << " len: " << len[0] << " " <<len[1] << " " << len[2] << " " << len[3] << endl;
} 

答案 2 :(得分:0)

首先,std::copy大致如下:

template <typename InputItr, typename OutputItr>
void copy(InputItr begin, InputItr end, OutputItr obegin)
{
    while (begin != end)
        *obegin++ = *begin++;
}

您的输出迭代器是uint32_t*,这实际上会导致您覆盖4个32位字! (缓冲区溢出)。您看到49,因为复制的第一个字符('1')的ASCII值为49。