C语言-----memcpy和memmove函数的模拟实现

memcpy:

用途:Copies characters between buffers.两块内存拷贝
函数原型:void *memcpy( void *dest, const void *src, size_t count );

  • 从src的位置开始向后赋值count个字节的数据到dest的内存位置。
  • 遇到‘\0’不会停下来。解决了strcpy遇到’\0’停下的缺陷。
  • 两块内存不能有重叠,否则结果是未知的。

模拟实现:

//任意类型的指针都可以传,所以就不能直接运算,不能解引用
void* my_memcpy(void *dest, const void *src, int count)
{
    void *ret = dest;
    assert(dest != NULL);
    assert(src != NULL);
    while (count--)
    {
        *(char*)dest = *(const char*)src;//强制类型转换为char *型,在解引用
        dest = (char*)dest + 1; //++(char *)dest;强制类型转换不能用于后置++
        src = (char*)src + 1; //++(char *)src;
    }
    return ret;
}
int main()
{
    int i = 0;
    char arr2[10] = { 0 };
    char arr1[20] = "abcdef";
    my_memcpy(arr2, arr1, 10);
    for (i = 0; i < 10; i++)
    {
        printf("%c ", arr2[i]);
    }
    system("pause");
    return 0;
}

memmove:

用途:Moves one buffer to another.
函数原型:void *memmove( void *dest, const void *src, size_t count );

  • 和memcpy的差别就是memmove函数处理的源内存卡和目标内存块是可以重叠的。
  • 如果出现重叠,就只能用memmove函数处理。

接下来要分情况讨论了,
这里写图片描述

如果dest在src的左边的话,那么src要从左向右去拷贝到dest空间中;
这里写图片描述

如果dest在src的右边的话,src要从右向左拷贝到dest空间中,否则会覆盖src中后边空间的内容
模拟实现:

void *my_memmove(void *dest, const void *src, int count)
{
    void *ret = dest;
    assert(dest != NULL);
    assert(src != NULL);
    if (dest < src)
    {
        //左->右
        printf("%d\n", count);
        while (count--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    else
    {
        while (count--)//15
        {
            *((char *)dest + count) = *((char *)src + count);//dest加count是第16个字节的地址
        }
    }
}
int main()
{
    int i = 0;
    int arr1[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    my_memmove(arr1 + 2, arr1, 16);
    for (i = 0; i < 9; i++)
    {
        printf("%d ", arr1[i]);
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/abc_xixi111/article/details/80197331