memmove() 定义中的重叠是什么

What is overlapping in memmove() definition?

本文关键字:重叠 是什么 定义 memmove      更新时间:2023-10-16

我正在从关于memcpymemmove的 c++ 参考中读取,他们似乎在做同样的事情,只是memmove有一个特定的想法称为(允许目标和源重叠)。

什么是重叠,何时发生?

这很简单。 考虑memmove(dest, source, length) .

如果范围指定的字节范围sourcesource + length - 1包括 destdest + length - 1 指定范围内的任何字节,则这两个范围重叠。

在数组中移动元素时最有可能发生这种情况。 例:

// Slide array down by one:
char array[N];
memmove( (void*) &array[0], (void*) &array[1], N - 1 );

这在元素 1 到 N-2 上重叠。 滑动另一个方向也有类似的重叠:

// Slide array up by one:
memmove( (void*) &array[1], (void*) &array[0], N - 1 );

如果要尝试使用 memcpy() 执行相同的操作,则生成的行为是未定义的。 如果在上面的两个示例中都使用 memcpy某些实现将正常工作。 如果您在此处使用memcpy而不是memmove,则其他两者中的一个或两个都将失败。 这是 C 和 C++ 在范围像这样重叠时未定义行为的结果 memcpy()