memmove的实现和模拟

1. 函数的调用形式

void *memmove(void *dst, const void *src, ize_t count)

2.功能

  • memmove函数的行为和memcpy差不多,只是它的源和目标操作数可以重叠。
  • memmove通常无法使用某些机器所提供的特殊的字节-字符串处理指令来实现,所以它可能比memcpy慢一些。
  • 如果源和目标参数真的可能存在重叠,就应该使用memmove。

3.实现

#include<stdio.h>
int main()
{
    int arr[9] = { 1,2,3,4,5,6,7,8,9 };
    int i = 0;
    memmove(arr + 2, arr, 16);
    for (i = 0; i < 9; i++)
    {
        printf("%d", arr[i]);
    }
    return 0;
}

这里写图片描述
4.模拟实现

#include<stdio.h>
#include<assert.h>
void *my_memmove(void *dest, const void *src, size_t count)
{
    void *ret = dest;
    assert(dest != NULL);
    assert(src != NULL);
    if (dest < src)//前->后
    {
        while (count--)
        {
            *(char *)dest = *(char *)src;
            dest = (char *)dest + 1;
            src = (char *)src + 1;
        }
    }
    else//后->前
    {
        while (count--)
        {
            *((char *)dest + count) = *((char *)src + count);
        }
    }
    return ret;
}
int main()
{
    int arr[9] = { 1,2,3,4,5,6,7,8,9 };
    int i = 0;
    my_memmove(arr + 2, arr, 16);
    for (i = 0; i < 9; i++)
    {
        printf("%d", arr[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40995778/article/details/80356934