memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
如果没有重叠,它可以像memcpy效果一样,但是效率没有memcpy高。为了方便拷贝各种类型的的数据,所以形参定义为void*,在函数内部再进行转化。
1.区域重叠的情况:
2.没有重叠的情况。
函数实现:
#include<stdio.h>
#include<assert.h>
void *my_memmove(void *dest, void *str, size_t len)
{
assert(dest);
assert(str);
char *pdest = (char *)dest;
char *pstr = (char*)str;
if ((pstr < pdest) && (pdest < pstr + len)) //源和目标有重叠的情况,从后往前拷贝
{
while (len--)
{
*(pdest + len) = *(pstr + len);
}
}
else //没有重叠,从前往后拷贝
{
while (len--)
{
*pdest = *pstr;
pdest++;
pstr++;
}
}
return dest;
}
测试:
int main()
{
int i = 0;
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int size = sizeof(arr) / sizeof(arr[0]);
my_memmove(arr, arr + 3, 8); //注意这里的长度是以一字节为单位的
for (i = 0; i <size ; i++)
{
printf("%d ", arr[i]);
}
getchar();
return 0;
}