memmove函数及模拟

memmove的作用是移动内存块

将字节数的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样,允许目标和源重叠。而memcpy在标准规定中不硬性要求拷贝的空间存在重叠。

以下是函数的声明

void * memmove ( void * destination, const void * source, size_t num );

1.函数的参数及其返回值

1.1参数

目的地(destina)

指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。

源(source)

指向要复制的数据源的指针,类型转换为 const void* 类型的指针。

无符号整形(size_t)

要复制的字节数。

1.2返回值

目标首地址,类型为void *

2.应用方式与memcpy类似

    int arr[10]={ 1,2,3,4,5,6,7 };
    memmove(arr + 4, arr, 20);
    for (int i = 0; i < 15; i++)
    {
        printf("%d\n", arr[i]);
    }

3.模拟实现

与之前memcpy不同,memmove可以作用于重叠的内存区域。

通过观察我们可以发现des若是落在source之前时采用从前向后的拷贝方式

落在source之前且source所指向的空间内应当采用从后向前

至于落在最后面则是两者均可,为了划分的方便则此处也采用从后向前

void* my_memmove(void* des, void const* source, size_t num)
{
    assert(des && source);
    void* ret = des;
    if (des <= source)
    {
        for (int i = 0; i < num; i++)
        {
            *((char*)des + i) = *((char*)source + i);
        }
    }
    else
    {
        while (num--)
        {
            *((char*)des + num) = *((char*)source + num);
        }
        return ret;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脆皮骷髏人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值