memcpy是无类型拷贝,也是一个返回值为void *类型的函数,接受的两个参数也是void *类型,还有一个参数是要拷贝的大小。
具体函数怎么实现,看代码:
void *my_memcpy(void *dest,const void *src,size_t count)
{
void *p = dest;
assert(dest);
assert(src);
while(count--)
{
*(char*)p = *(char*)src;
p = (char *)p +1;
src = (char*)src +1;
}
return dest;
}
代码实现起来很简单。唯一要注意的就是参数是void *的必须要强转为char*型,进行一个字符一个字符的拷贝。
再看我们的memmove函数,这个函数和memcpy比较相像,来我们来看代码:
void *my_memmove(void *dest,const void *src,size_t count)
{
void *p = dest;
if((dest>src) && (char *)dest < ((char *)src +count))//说明内存重叠
{
dest = (char *)dest+count - 1;
src = (char *)src+count - 1;
while(count--)
{
*(char *)dest = *(char *)src;
dest = (char *)dest - 1;
src = (char *)src - 1;
}
}
else
{
while(count--)
{
*(char*)dest = *(char*)src;
dest = (char *)dest +1;
src = (char*)src +1;
}
}
return p;
}
memcpy与memmove两个最大的区别就是处理内存重叠问题,memmove可以处理内存重叠,而memcpy不行,所以看
上面memmove函数加了一个判断,也就是当目的地址大于源地址并且目的地址小于源地址加上要拷贝字长,那么就内存重叠。
处理内存重叠的办法呢,就是让拷贝从后向前拷贝。