一:memmove函数的定义:
memmove函数功能的解释:
函数memmove 从 source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置,然后返回目的数组的起始地址。
memmove函数要点:
1, 函数memmove从arr1+3(元素4)的位置开始向后复制20个字节(4,5,6,7,8)的数据到arr1(1,2,3,4,5)的内存位置。
![](https://img-blog.csdnimg.cn/direct/4ef424265d3144a1a0280a54b297a4f6.png)
![](https://img-blog.csdnimg.cn/direct/9ad4724d16044703922f76915adc43d0.png)
![](https://img-blog.csdnimg.cn/direct/b004c4ea4db44745ae4ba2ae08a3447d.png)
这种情况下将stc的数据从前到后复制给dest和将src的数据从后到前复制给dest是一样的
二:重叠 (就是源内存块和目标内存块是重叠的)
这种情况下将stc的数据从前到后复制给dest和将src的数据从后到前复制给dest是不一样的!
以第一图为例:
若是从前往后复制,就是按照4,5,6,7,8的顺序复制给1,2,3,4,5,可以得到4,5,6,7,8,6,7,8,9,10(正确)
若是从后往前赋值,就是按照8,7,6,5,4的顺序复制给5,4,3,2,1,无法得到4,5,6,7,8,6,7,8,9,10(正确)而是得到7,8,6,7,8,6,7,8,9,10(错误)
以第二图为例:
若是从前往后复制,就是按照4,5,6,7,8的顺序复制给6,7,8,9,10,可以得到1,2,3,4,5,4,5,4,5,4(错误),而不是1,2,3,4,5,4,5,6,7,8
若是从后往前复制,就是按照8,7,6,5,4的顺序复制给10,9,8,7,6,可以得到1,2,3,4,5,4,5,6,7,8 (正确)
由这两种情况可知,重叠的情况结果由dest指针和src指针的位置来决定:
总结:
一:dest在src的前面又重叠,就从前往后进行复制;dest在src的后面又重叠,就从后往前复制
二:再综合不重叠的情况,dest在src的前面又不重叠,前往后,后往前都行,就按照第一点采用前往后;dest在src的后面又不重叠,前往后,后往前都行,就按照第一点采用后往前
三:即dest在src前面,采用前往后复制,dest在src后面,采用后往前复制
第一种重叠代码展示:
第二种重叠代码展示:
以上两种重叠结果都正确!