内存函数(memcpy、memmove)

  我们知道strcpy这个函数的功能是在源字符串 '\0' 之前不受限制的向目标字符串进行拷贝,直到将 '\0' 拷贝后,拷贝停止,但是遗憾的是,它只能作用于字符串。所以,一个很现实的问题就出现了,我们需要拷贝的数据类型不可能仅仅局限于字符串类型,于是乎,memcp与memmove这两个完美的函数就出现了。

首先,我们来看一看这两个函数:

①void * memmove ( void * 目的地, const void * 源, size_t num );
②void * memcpy ( void * 目的地, const void * 源, size_t num );

  我们可以看到,这两个函数的返回类型是 void*,参数部分的两个指针类型也是void*,另一个参数类型是size_t(字节),而字节又是计算机中最小的单位 ,void*可以接收任何指针类型,这就意味着,这两个函数可以对任何类型的指针进行操作,mommove与momcpy都是拷贝功能,那么,又一个问题出现了,二者有何区别?

    我们先来说说memcpy吧,使用起来也十分简单,将从源地址开始向后移动num个字节的数据拷贝到从目的地地址开始向后移动num个字节的空间中,这个功能看起来已经很完美了,但是如果源地址和目的地的地址是同一组数据呢?例如:memcpy ( des, sou, 20 );

 

  按照上述逻辑,最后呈现出的数据是这样的:

 

  很显然,这并不是我们想要的结果,因为在拷贝的过程中,需要存放被拷贝数据的空间与拷贝数据的空间这两部分的空间重叠了,所以后续需要拷贝的数据已经被前面拷贝的数据所覆盖,因此得不到我们想要的结果,那如果我们将源地址的最后一个拷贝数据拷贝到目的地地址的最后一个数据中,然后将两个地址都想前移动一个字节,再次拷贝,这样循环下去,直到sou为止,这样就可以实现我们想要的结果了。但是 memcpy 不会自己去分辨,这时, memmove 就出现了,这个函数可以自己去判断从什么位置开始进行拷贝。

  可以说memmove是memcpy的升级版,如果说memcpy已经够帅了,那memmove的出现便意味着他还不够帅。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值