memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void* Memcpy(void* dest, const void* src, size_t num)
{
assert(src != NULL);
assert(dest != NULL);
char* psrc = (char*)src;
char* pdest = (char*)dest;
for (size_t i = 0; i < num; i++)
{
pdest[i] = psrc[i];
}
return dest;
}
void * Memmove(void * dest, const void * src, size_t num)
{
assert(dest != NULL);
assert(src != NULL);
char* psrc = (char*)src;
char* pdest = (char*)dest;
//1.缓冲区重合
if (psrc<pdest&&psrc + num>pdest)
{
char* psrc_ = psrc + num - 1;
char* pdest_ = pdest + num - 1;
for (; psrc_ >= psrc; --psrc_, --pdest_)
{
*pdest_ = *psrc_;
}
}
//2.缓冲区没重合
else
{
Memcpy(dest, src, num);
}
}
int main()
{
char str[] = "memmove can be very useful......";
Memmove(str + 20, str + 15, 11);
puts(str);
system("pause");
return 0;
}
当缓冲区不重合时,memmove函数的作用和memcpy函数的作用相同;当缓冲区重合时,如下图所示:
如果直接从src处复制,则后面从7开始的元素就会被覆盖掉,导致数据丢失,但是如果从src的最后一个元素复制,则不会导致数据丢失。