【问题标题】:How to copy a vector to a subvector of another vector without segfaulting?如何在没有段错误的情况下将向量复制到另一个向量的子向量?
【发布时间】:2017-11-19 21:13:39
【问题描述】:

我有一些看起来像这样的代码:

for (int = i; i > (chip.rom.size() - 1); i++) {
        //int i = 0;
        chip.memory[i + 512] = chip.rom[i];
        //i++;

}

chip 是一个结构,其中 memory 和 rom 都是无符号字符的向量

rom 是一个 160 字节的向量,它是我用来测试我的模拟器的游戏 rom。

memory 被归零为 4096 字节,如下所示:

chip.memory = std::vector<BYTE>(4096);

在调试时,我设法发现我在这个 for 语句之后出现了段错误。我感觉我快疯了!我错过了什么明显的错误?

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花时间浏览The Tour 并参考Help Center 中的材料,了解您可以在此处询问的内容和方式。发布minimal reproducible example尤为重要。
  • 你没有初始化 i
  • 好的,谢谢你的链接!
  • @Sopel 谢谢。我不敢相信我错过了。虽然我的第二个向量 chip.memory 没有改变(它仍然归零)。

标签: c++ vector c++14


【解决方案1】:

您没有初始化 i 并且您的比较方向错误。此外,如果您使用&lt; 进行比较,如果您只是想避免跑到chip.rom 的末尾,那么- 1 是不必要的。

你甚至根本不应该在这里使用循环。以下是代码的阅读方式:

#include <algorithm>  // Somewhere up above

::std::copy(chip.rom.begin(), chip.rom.end(), chip.memory.begin() + 512);

使用&lt;algorithm&gt; 标头中的内容,您不必记住始终正确获取for 语句中的所有内容。不仅如此,您的编译器很可能会生成更高效的代码。

【讨论】:

  • 更好的方法是使用.assign(first, last)
  • @АлексейНеудачин OP 想要写入现有位置,而不是两个相同的向量
  • 是的,应该是.insert(where , first, last)
  • 总的来说memcpy 是这类东西的首选方法。并且std::string 比字节向量更好。但是你仍然可以做memcpy(&amp;vect[0] + 512 , ..)
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 2016-07-08
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多