模拟库函数memcpy、memmove

模拟库函数memcpy

函数原型:

void *memcpy( void *dest, const void *src, size_t count );

函数功能:

这里写图片描述

memcpy函数是从源字符串中取前count个地址字符放入到目标字符串前count个地址位置,目标字符串前count个地址原有字符将被覆盖。
memcpy还可以操作数组元素。

模拟实现(第一次写的漏洞):

char *my_memcpy(char *dest, const char *src, size_t count)
{
    char *ret = dest;
    assert(NULL != dest);
    assert(NULL != src);

    while (src != '\0' && count)
    {
        *(dest++) = *(src++);
        count--;
    }
    return ret;
}

以上实现方法类似strncpy函数,只能操作字符串,为了实现memcpy所有功能,这样实现。

最终版:

void *my_memcpy(void *dest, void *src, size_t count)
{
    char *p1 = (char *)dest;
    char *p2 = (char *)src;
    char *ret = p1;

    while (count--)
    {
        *p1 = *p2;
        p1++;
        p2++;
    }
    return ret;
}

模拟库函数memmove

函数原型:

void *memmove( void *dest, const void *src, size_t count );

函数功能:

这里写图片描述

扫描二维码关注公众号,回复: 2399975 查看本文章

这里写图片描述

函数有三个参数,目标位置,源位置,count(内存移动个数),函数实现由src所指内存区域复制count个字节到dest所指内存区域

对于内存移动分为两种情况:

1、内存有重叠区:

这里写图片描述

2、内存没有重叠区:

这里写图片描述

源码实现:

void *my_memmove(void *dest, void *src, size_t count)
{
    assert(NULL != dest);
    assert(NULL != src);
    char *pdest = (char *)dest;
    char *psrc = (char *)src;

    if (psrc < pdest && pdest < psrc + count)     //内存有重叠
    {
        cout << "内存重叠" << endl;
        while (count--)
            *(pdest + count) = *(psrc + count);
    }
    else
    {
        cout << "内存没有重叠" << endl;
        while (count--)
            *pdest++ = *psrc++;
    }
    return dest;
}

完整代码查看

猜你喜欢

转载自blog.csdn.net/m0_37925202/article/details/81154053