void *memmove(void *dest, const void *src, size_t count)
{
char *tmp;
const char *s;
if (dest <= src) {
tmp = dest;
s = src;
while (count--)
*tmp++ = *s++;
} else {
tmp = dest;
tmp += count;
s = src;
s += count;
while (count--)
*--tmp = *--s;
}
return dest;
}
这个是从linux内核里面提取的源码,我们可以看到memmove 考虑到内存重叠的情况,需要判断内存地址位置,
如果dest在src的前面,那就可以从头部开始move,反之则需要从尾部开始move
另外需要注意的是参数类型是void*,这个是不能进行运算操作的,必须转为char* (网上看到有些文章没有转换应该是错误的)
当然有些同学可能觉得代码还可以更精简,其实本质应该还是一样的,以下代码仅供参考
void *memmove(void *dest, const void *src, size_t count)
{
void *ret = dest;
if (dest <= src) {
while (count--)
*(char*)dest++ = *(char*)src++;
} else {
dest = (char*)dest + count;
src = (char*)src + count;
while (count--)
*--dest= *--src;
}
return ret;
}