从 std::string 到 std::array<char,size> 的 memcopy 额外数据是未定义的行为吗?

Is memcopy extra data from std::string to std::array<char,size> an undefined behavior?

我并不是要在生产环境中使用这段代码,但我有点困惑 it.I 认为它一定是未定义的,但是,我 运行 这段代码没有 crash.Is这只是巧合?

#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?
  // }
}

I thought it must be undefined

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

however, I ran this code without crash

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