首页 > 解决方案 > 是否将 std::string 中的额外数据 memcopy 到 std::array未定义的行为?

问题描述

我并不是说要在生产环境中使用这段代码,但我对此有点困惑。我认为它一定是未定义的,但是,我运行这段代码没有崩溃。这只是巧合吗?

#include <array>
#include <string>

auto main(int argc, char** argv) -> int {
  // for (int i = 0; i < 1000; ++i) {
  std::array<char, 1000> dst;
  std::string src = "hello world";
  memcpy(dst.data(), src.c_str(), dst.size()); // is this undefined behavior?
  // }
}

标签: c++memcpy

解决方案


我认为它必须是未定义的

是的,这是未定义的行为。src.data指向一个包含 12 个字符(=12 个字节)的数组,但memcpy会尝试从中读取 1000 个字节,因此它会越界读取。

但是,我运行这段代码没有崩溃

这就是未定义行为的意义所在。任何事情都可能发生。这包括完全没有任何问题的运行。


推荐阅读