memmove的原型是:
void * memmove ( void * dst,
const void * src,
size_t count);
实现memmove有两个要点:
(1)从src指向的内存拷贝count个字节到dst指向的内存中。
(2)处理src和dst有重叠的情况,这是和memcpy不一样的地方。
要满足条件(1)比较简单,借用memcpy的实现:
void * ret = dst;
/*
* copy from lower addresses to
* higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
void是不可以赋值的,所以上述实现执行了(char*)的转换。
这个实现无法满足条件(2),当src和dst指向的内存有重叠时,上述实现可能无法正确复制。
比如以下情况,s表示source,而d表示destination。