【问题标题】:Is memcopy extra data from std::string to std::array<char,size> an undefined behavior?从 std::string 到 std::array<char,size> 的 memcopy 额外数据是未定义的行为吗?
【发布时间】:2020-05-25 07:53:44
【问题描述】:

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

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

【问题讨论】:

  • 未定义的行为并不意味着“保证崩溃”
  • @StoryTeller-UnslanderMonica 所以我问了Is this just conincidence?
  • 这是未定义的行为,未定义的行为可能意味着崩溃失败。我不确定我是否会将这种情况描述为巧合。它只是常规的未定义行为。
  • 仅供参考 未定义行为可能导致时间旅行stackoverflow.com/questions/24527401/…
  • 只是巧合吗? 这个问题通常无法回答。这可能是巧合,也可能不是。至少需要研究生成的程序集。在装配级别,可能不会发生任何违法行为。

标签: c++ memcpy


【解决方案1】:

我认为它一定是未定义的

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

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

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

【讨论】:

    猜你喜欢
    • 2012-06-09
    • 2021-09-28
    • 1970-01-01
    • 2020-03-22
    • 2021-05-10
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多