手撕memcpy,memmove

  1. —memcpy,memmove—
  2. memcopy与memmove

—memcpy,memmove—

memcpy,memmove都是内存拷贝的函数,不过memcpy不检查内容拷贝的正确性,memmove会检查内存重叠问题

memcopy与memmove

//memcpy
/*第 1 行:函数接口必须不能错!尤其是 src 前必须加 const 修饰,进行保护。
第 3 行:先写返回值,即将目标内存地址保存下来用于返回。
第 4 行:循环条件,根据拷贝长度逐字节循环拷贝,必须用 count-- 不能 --count。
第 6 行:void * 指针每次使用时要先进行类型转换。
第 7 - 8 行:指针偏移操作,这也是为什么第 3 行要先写返回值。*/
void* m_memcpy(void* dst, const void* src, unsigned int count)
{
    void* ret = dst;
    while (count--)
    {
        *(char*)dst = *(char*)src;
        dst = (char*)dst + 1;
        src = (char*)src + 1;
    }
    return ret;
}




//memmove 进行内存重叠检查
/*若目标内存地址头部与源内存地址尾部重叠,正序拷贝时会破坏源内存数据
当源内存区域的尾部与目标内存区域的头部重叠时,memmove 会采用倒序拷贝的策略
即如下图所示,前两种情况 memmove 采用正序拷贝,第三种情况采用倒序拷贝*/
//dst 在左 src在右 
//src+count 在左 dst在右 正序
void* m_memmove(void* dst, const void* src, unsigned int count)
{
    void* ret = dst;
    if ((char*)src + count <= dst || dst <= src)
    {
        while (count--)
        {
            *(char*)dst = *(char*)src;
            dst = (char*)dst + 1;
            src = (char*)src + 1;
        }
    }
    else
    {
        dst = (char *)dst + count - 1;
        src = (char*)src + count - 1;
        while (count--)
        {
            *(char*)dst = *(char*)src;
            dst = (char*)dst - 1;
            src = (char*)src - 1;
        }
    }

    return dst;

}
//strcpy
char* m_strcpy(char* dst, const char* src)
{
    char* ret = dst;
    while (* src != '\0')
    {
        *dst = *src;
        dst++;
        src++;
    }
    return ret;
}

/


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 351134995@qq.com

×

喜欢就点赞,疼爱就打赏