1.memcpy
void * memmove ( void * destination, const void * source, size_t num );
函数memcpy从source的位置复制num个字节到的位置,当遇到'\0'时停止;
当arr1为 source, arr2为destination;
复制1-5;num= 20 个字节;
scr -> destination
memcpy由字节一一复制;
模拟memcpy实现如下:
2.memmove
void * memmove ( void * destination, const void * source, size_t num );
memmove 和 memcpy 的差别是 memmove 函数处理的源内存块和目标内存块是可以重叠的,
如果源空间和目标空间出现重叠,就需要使用 memmove 函数处理。
如上
数组中存储10个数,数组为int类型,每个数为4个字节,20个字节为5个数
scr为arr首元素地址
dest为arr+3元素地址
当进行复制的时
当全部重叠完为:1 2 3 1 2 3 4 5 9 10
当模拟实现 memmove 需要注意 dest 与 src:
当src 小于 dest 时 ,从前 -> 后的复制方式会导致后面的数字丢失 ;
所以只能从 后 -> 前;
src 大于dest 时 ,才可以从 前 -> 后 复制;
由此可以分析出两种选择:
1. 1与3 由 前—>后, 2 由 后—>前;
2. 2与3 由 后 —>前, 1 由 前—>后;
代码可由上面的规则编写:
当代码可以判断由前向后或后下前后,补全代码: