下面重点来讲解memcpy和memmove的区别:
这两个函数的函数原型(除了名字)是一样的:
void *memcpy(void *dst, const void *src, size_t count):
void *memmove(void *dst, const void *src, size_t count);
它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果都是一样的。但有交叉时不一样。源内存和目标内存交叉的情况有以下两种:(左边为低地址)
即:dst<=src 且 dst+count>src
即:src<dst且src+count>dst
下面将针对这两种情况来讨论。针对第一种交叉情况情况,dst<src且dst+count>src,memcpy和memmove的结果是一样的。请看下面的例子讲解:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a, a+4, sizeof(int)*6);和memmove(a, a+4, sizeof(int)*6);结果是:
4567896789
针对第二种情况,src<dst且src+count>dst,memcpy和memmove的结果是不一样的。请看下面的例子:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a+4, a, sizeof(int)*6)
memmove(a+4, a, sizeof(int)*6)
memmove可能的实现(非库函数实现,自己的实现):
<span style="font-family:Microsoft YaHei;font-size:14px;">void *memmoveMy(void *dst, const void *src, size_t count)
{
assert((dst != NULL) && (src != NULL) );
char *tmpdst = (char *)dst;
char *tmpsrc = (char *)src;
if (tmpdst <= tmpsrc || tmpdst >= tmpsrc + count)
{
while (count --)
*tmpdst++ = *tmpsrc++;
}
else
{
tmpdst = tmpdst + count - 1;
tmpsrc = tmpsrc + count - 1;
while (count --)
*tmpdst-- = *tmpsrc--;
}
return dst;
}</span>