memcpy函数底层源码实现
destin目标地址,source为源内存地址,n为拷贝的字节数
void *memcpy(void *destin, void *source, unsigned n);
在实现memcpy的时候注意源地址和目的地址是否重叠,当源地址的尾部与目的地址头部重叠时,要从尾部开始拷贝。如图所示。
发现上图重叠时,我们要从尾部开始复制,这样复制的方法,source的尾部先拷贝到destin的尾部,可以将source完整的复制到destin。
底层实现
void *memcpy(void *dst, const void *src, size_t size)
{
char *psrc;
char *pdst;
if (NULL == dst || NULL == src)
{
return NULL;
}
if ((src < dst) && (char *)src + size > (char *)dst) // 出现地址重叠的情况,自后向前拷贝
{
psrc = (char *)src + size - 1;
pdst = (char *)dst + size - 1;
while (size--)
{
*pdst-- = *psrc--;
}
}
else
{
psrc = (char *)src;
pdst = (char *)dst;
while (size--)
{
*pdst++ = *psrc++;
}
}
return dst;
}