memmove
void* memmove(void* dest, const void* src, size_t num);
void* dest --- 接收任意类型的指针,指向指向存储数据源的目标地址
const void* src --- 不可被修改的,接收任意类型的指针,指针指向复制的数据源
size_num --- 复制的大小,单位字节
memmove从src中复制num个字节的内容到dest中,如果遇到dest和src重叠的数据源,memmove函数会保证数据被覆盖前将字节复制到目标区域中,如果没有重叠部分与memcpy函数功能一样,memmove比memcpy更具有安全性。
#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(dest < src){
//前->后
while(num--){
*(char*)dest = *(char*)src;
(char*)dest++; // 注意优先级
(char*)src++;
}
}else{ // dest >= src
//后->前
while(num--){
*((char*)dest+num) = *((char*)src+num); //注意优先级
}
}
return ret;
}
int main(){
// 1 2 3 1 2 3 4 5 9 10
int arr1[20] = {1,2,3,4,5,6,7,8,9,10};
void* ret = my_memmove(arr1+3,arr1,20);
int i=0;
for(i=0;i<10;i++){
printf("%d ",arr1[i]);
}
return 0;
}