我们知道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的出现便意味着他还不够帅。