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

rul*_*lof 5 c c++ overlapping

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

什么是重叠,什么时候发生?

Joe*_*e Z 9

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

如果由范围指定的字节的范围内source,以source + length - 1包括在所指定的范围内的任何字节destdest + length - 1,两个范围重叠.

在阵列中移动元素时最有可能发生这种情况.例:

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

这与元素1到N-2重叠.滑动另一个方向有类似的重叠:

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

如果您尝试使用相同的操作memcpy(),则结果行为未定义. 如果您在上面的两个示例中使用,某些实现将正常工作memcpy.如果你memcpy在这里使用而不是,那么其他人中的一个或两个都会失败memmove.这是C和C++ memcpy()在范围重叠时保持行为未定义的结果.