我正在阅读关于memcpy
和memmove
的c ++参考资料,他们似乎做了同样的事情,只是memmove
有一个特定的思维调用(允许目标和来源)重叠)。
什么是重叠以及何时发生?
答案 0 :(得分:9)
这很简单。考虑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()
留下未定义的行为。