memmove 函数
用于内存拷贝的函数,没有类型限制,但是memmove使用要考虑内存重叠问题
void * memmove(void * destination, const void * source, size_t num);
用于从src中拷贝num个任意类型的内容到dest,如果目标区域和源区域有重叠(并不是所有重叠情况都需要特殊处理),memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域。
会发生内存重叠的情况:
库中实现的memmove函数
int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
return 0;
}
模拟实现memmove函数:
void* My_memmove(void* dest, const void* src, size_t num)
{
assert(dest);
assert(src);
void* p = dest;
if ((dest > src) && ((char*)dest < ((char*)src + num))) //此时发生内存重叠,需要从后向前拷贝
{
dest = (char*)dest + num - 1;
src = (char*)src + num - 1;
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
else
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return p;
}
int main()
{
char ppy[] = "abc vvt xxx www qqqqqqqqqqqqq";
printf("%s\n", My_memmove(ppy + 6, ppy + 4, 11));
system("pause");
return 0;
}