c语言| |memcpy函数与memmove函数

memcpy和memmove函数


memcpy函数


1.源函数

void *memcpy(void *dest, const void *src, size_t n)

2.作用

(小编自己的理解)内存拷贝。从src内存空间移动n个元素,将其赋值给dest的内存中,从内存中第一个地址所指向的数据开始赋值,直到赋值n个数据,该函数调用结束,同时返回dest,即返回被赋值的内存的起始位置。返回dest的意义是可是增加链接属性。

memcpy函数实现:(my_memcpy)原谅小编没有找到源代码

#include <assert.h> //包含assert函数的头文件
#define my_type int //自己定义要进行内存赋值的数据类型

my_type *my_memcpy(my_table *dest, const my_type *src, size_t n)
{
    my_type *start = dest; //用于返回dest的初始地址,使该函数具有链接属性
    assert(dest != NULL); //断言dest与src不是空地址
    assert(src != NULL);    
    while (n--)
    {
        *dest++ = *src++;
    }
    return start;
}

不了解assert函数的同学们,可以戳一戳assert了解一下哦!


memmove函数

1.源函数

void *memmove(void *dest, const void *src, size_t n)

2.作用

(小编自己的理解)内存拷贝。基本功能与memcpy函数一致。不一样的地方在于,若是目标区域与源区域有重叠的部分的话,可以在源区域未被目标区域覆盖的时候,将其拷贝到目标区域当中。从而实现内存拷贝的功能。

memmove函数的实现:(my_memmove)原谅小编没有找到源代码

#include <assert.h> //包含assert函数的头文件
#define my_type int //自己定义要进行内存赋值的数据类型

my_type *my_memmove(my_table *dest, const my_type *src, size_t n)
{
    my_type *start = dest; //用于返回dest的初始地址,使该函数具有链接属性
    assert(dest != NULL); //断言dest与src不是空地址
    assert(src != NULL);    
    while (n)
    {
        *(dest + n - 1) = *(src + n -1); //从最后一个要拷贝的内存开始拷贝依次先前拷贝
        n--;
    }
    return start;
}

对比

1.memcpy函数与memmove函数进行对比

  • memcpy函数对于处理内存不重叠的情况,memmove函数可以处理内存重叠的情况

分情况:

<1> 内存不重叠

<2>内存重叠,(src < dest)只能使用memmove函数

<3>内存重叠,(dest < src)可以使用memcpy函数

  • 原理区别

原理:memcpy函数是从左边一个一个的将src中的值拷贝到dest中,而memmove函数是既可以从左边开始拷贝又可以从右边开始拷贝的。所以对于memcpy函数只有<1><3>情况可以使用,而对于<2>情况则会出现问题。而memmove函数拷贝的就不会出现错误。

memcpy的错误:会将第一个和第二个拷贝过去的最后再拷贝到最后的第一个和第二个上。就会出现错误。

2.内存拷贝函数与字符串拷贝函数的对比

  • 使用的类型不同,strcpy函数只对字符串进行操作;memmove函数和memcpy函数对所有类型都适用,为内存拷贝

  • strcpy函数以’\0’为拷贝的结束条件;而memmove函数和memcpy函数则是以第三个参数num进行控制拷贝

如有不足:请告诉小凯,会及时更新与修改的,谢谢大家

如果对github感兴趣可以到我的github中看一下

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值