目录
一、memmove函数的介绍
函数参数介绍:
destination:移动到目标的起始位置
source:被移的起始位置
num:需要移动多少字节
二、模拟实现
移动时需要分情况讨论:
1,若被移动的起始位置src在移动到起始位置dest后面,也就是src > dest,这时不能从后往前拷贝,假如从后往前拷贝,比如图中的9会被拷贝到7的位置上,接着8会被拷贝到6的位置上,当我们需要拷贝7的位置时,发现此位置中的数据被修改了,所以不能从后往前拷贝,只能从前往后拷贝。结论:src > dest时,从前往后拷贝
2,若被移动的起始位置src在移动到起始位置dest前面,也就是src < dest,这是不能从前往后拷贝,假如从前往后拷贝,比如图中的1会被拷贝到3的位置上,接着2会被拷贝到4的位置上,当我们需要拷贝3的位置时,发现此位置的数据被修改了,所以不能从前往后拷贝,只能从后往前拷贝,当然src和dest的位置没有重叠时,选择这两种当中的任意一种都可以。结论:src <= dest时,从后往前拷贝。
三、代码实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num) {
assert(dest && src);
void* ret = dest;
if (src > dest) {
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else {
while (num--) {
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;