我正在从C++引用中阅读有关memcpymemmove的内容,它们似乎在做相同的事情,只是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()保留行为未定义的事实。

关于c++ - memmove()定义中有什么重叠?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20725573/

10-11 16:09