一. 函数简介
- 头文件:cstring
- 函数原型:void *memmove(void *dest, const void *source, std::size_t size);
- 功能:将指针source所指向内存区域的前size个字节复制到指针dest所指向的内存区域。如果出现内存重叠,函数能够保证源区域被覆盖前将重叠的区域复制到目标区域,但源区域内容会被更改。
二. 什么叫内存重叠?
说明
- 情况1:目标区域在源区域前,区域无重叠。
- 情况2:目标区域在源区域后,区域无重叠。
- 情况3:目标区域在源区域前,区域有重叠。
- 情况4:目标区域在源区域后,区域有重叠。
三. 分析
对于上述的四种情况,可以采用最简单的思路,即从源区域由左至右按字节将内容复制到目标区域(思路一)。
代码实现:
namespace o7si {
void *memmove(void *dest, const void *source, std::size_t size) {
if (dest == nullptr || source == nullptr)
return nullptr;
char *pDest = static_cast<char *>(dest);
const char *pSource = static_cast<const char *>(source);
while (size--)
*pDest++ = *pSource++;
return dest;
}
}
结果如图所示:
- 对于无重叠的两种情况,源区域的内容成功复制到了目标区域,并且源区域的内容均未改变。
- 对于有重叠的两种情况,源区域的内容均被改变,