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;
}

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐