-1

请看下面的代码片段:

#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。我错过了什么吗

4

3 回答 3

5

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

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

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

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

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

要在 C++ 中解析数字,请使用 asstd::stringstream或,从 C++11 开始,std::stoi

于 2012-06-21T12:46:09.280 回答
1

std:copy 无法按您的预期工作。它将源“元素方式”复制到目标。所以它将第一个 uint8(= char '1' == 0x49 in hex)复制到 '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;
} 
于 2012-06-21T12:51:13.253 回答
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。

于 2012-06-21T12:49:38.580 回答