目录
一,了解memmove与memcpy
1.memcpy
是将原字符串src的前count个字节所存储的数据存放到目标字符串dest处。
2.memmove
而memmove与memcpy的返回类型,参数都一致,功能也相似,是将原字符串src的前count个字节存储的数据移动到目标字符串dest中。
二,memmove与memcpy的实现
1.memcpy:
P.S.
1.返回类型,输入参数为void*类型是由于void*类型的指针可以接受各种不同类型的指针,所以memcpy不同于strcpy的区别就是memcpy可以copy各种类型的数据。
2.函数实现方法:通过强制类型转换来将void*类型的指针转化为char*的指针,再通过一个字节一个字节的拷贝来完成函数的实现
2.memmove的实现
为什么同时有memmove和memcpy两种功能相似的函数
arr1为1,2,3,4,5,6,7,8,9
将arr1的前四个元素放到arr1+2也就是arr1[2]的位置上,那么得到的结果应该为:
1,2,1,2,3,4,7,8,9
但发现运行结果为:
分析:
将arr1[0] -> arr1[2]中 1,2,1,4,5,6,7,8,9
将arr1[1] -> arr1[3]中 1,2,1,2,5,6,7,8,9
将arr1[2] -> arr1[4]中 1,2,1,2,1,6,7,8,9
将arr1[3] -> arr1[5]中 1,2,1,2,1,2,7,8,9
这时候发现是由于存储时覆盖了原本的数据而影响了结果
因此为了避免这种影响,就有了memmove函数。
memmove的实现
通过此图可以发现:
当dest<src时(也就是dest1的位置),需要从前往后移动数据
当dest>src时(也就是dest2的位置),需要从后往前的移动数据
而当dest与src所占据的空间没有重叠时,无论哪种方式移动数据都可以。
代码实现:
注意:
在VS 2019编译器下,无论是memcpy也是通过memmove的方式实现的,因此二者无差,但在别的编译器下的memcpy可能不能实现空间重叠是的数据拷贝。