【问题标题】:Qt: memcpy failed.. How to copy?Qt: memcpy failed..如何复制?
【发布时间】:2020-06-17 00:47:39
【问题描述】:

我今天的问题是关于 Qt 和 memcpy() 函数。 我有一个 QByteArray i_byte_array 包含我需要的原始数据。我尝试的第一件事是将这些数据复制到 char* l_array 中。 这给了我:

void blablafunctionblabla(const QByteArray& i_byte_array)
{
   char* l_array = (char*)malloc(i_byte_array.size());
   memcpy(l_array, i_byte_array, i_byte_array.size());
   // OR: char* l_array = i_byte_array.data(); // same result
}

当我运行代码时,我希望复制 i_byte_array 的全部内容,即: i_byte_array values

结果我只得到了这个......: l_array value

复制似乎在第一个 /0 处停止,忽略了我要求他复制的大小..

所以我的问题是为什么 memcpy 函数会发生这种情况?为了复制所有原始数据,我需要如何进行? (甚至 /0 这对我来说是有用的数据)

【问题讨论】:

  • char* l_array = i_byte_array.data(); 并没有真正复制任何东西,除了这里的指针
  • memcpy(l_array, i_byte_array.data(), i_byte_array.size());
  • 作为 C++ 程序员,您不应该立即使用 C 函数,例如 mallocmemcpy -- 使用 std::copy 并使用 memcpy 的参数不会已编译,从而防止您在运行时犯此错误。另外,当您的数据已经位于i_byte_array 中时,想要创建另一个缓冲区的原因是什么?
  • @BigTemp :是的,你说得对,对不起。但即使在这里,在 \0 之后我也没有得到其他值。我认为 memcpy() 并不关心这个角色。
  • @pm100 : 谢谢你的回答,我试试你说的但结果一样:/

标签: c++ qt memcpy


【解决方案1】:

其实memcpy 不会忽略空字符。我猜 IDE(可能是 Qt Creator)会忽略空字符,所以您看不到 char 字符串的全部内容。

如果您通过以下方式将l_array 导入QByteArray

QByteArray ba = QByteArray::fromRawData(l_array, i_byte_array.size());

你会看到ba的内容和i_byte_array是一样的。

您可以查看 SO 的 memcpy 问题:How could I copy data that contain '\0' character

【讨论】:

  • 是的,谢谢@wthung 的回答。这只是一个 Qt Creator 问题,当我查看复制前后的内存时,我可以看到整个字节数组都被复制了。即使 Qt Creator 在第一个 '\0' 处停止显示。结论:memcpy 工作正常,我可以用 :) 解析数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多