我正在从C++引用中阅读有关memcpy
和memmove
的内容,它们似乎在做相同的事情,只是memmove
具有特定的思维方式(允许目标和源重叠)。
什么是重叠的,何时发生?
最佳答案
非常简单。考虑memmove(dest, source, length)
。
如果source
到source + length - 1
范围指定的字节范围包括dest
到dest + 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/