memmove()定义中有什么重叠?

时间:2013-12-22 02:18:06

标签: c++ c overlapping

我正在阅读关于memcpymemmove的c ++参考资料,他们似乎做了同样的事情,只是memmove有一个特定的思维调用(允许目标和来源)重叠)。

什么是重叠以及何时发生?

1 个答案:

答案 0 :(得分:9)

这很简单。考虑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()留下未定义的行为。