1,函数声明
void* memcpy(void* dest,void* source,unsigned count);
void *memmove(void *dest, void *source, unsigned count);
memcpy和memmove都是对于内存的拷贝,当他们被应用在不同的内存区域拷贝(source和dest志向不同的内存区域)时,效果是一样的,
但是当source和dest的内存区域overlap时,使用着两个函数将会出现不同的现象。
这还取决于source和dest的大小
memmove的处理措施:
(1)当source的首地址等于dest的首地址时,不进行任何拷贝
(2)当source的首地址大于dest的首地址时,实行正向拷贝
(3)当source的首地址小于dest的首地址时,实行反向拷贝
这里我做了一个测试,结果如下
condition:arr和arr1,arr2,arr3都是一个含有10个元素,从0-9
然后调用
memcpy((void*)arr, (void*)&arr[4], sizeof(int) * 6);
memcpy((void*)&arr[4], (void*)arr, sizeof(int) * 6);
memmove((void*)arr, (void*)&arr[4], sizeof(int) * 6);
memmove((void*)&arr[4], (void*)arr, sizeof(int) * 6);
result:
memcpy arr(src > des)
4 5 6 7 8 9 6 7 8 9
memcpy arr1(src < des)
0 1 2 3 0 1 2 3 0 1
memmove arr2(src > des)
4 5 6 7 8 9 6 7 8 9
memmove arr3(src < des)
0 1 2 3 0 1 2 3 4 5
唯一的不同在于当src < des时
3,原因
{
while
(n-–)
*d++ = *s++;
return
dest;
}
{
{
// start at beginning of s
while (n--)
*d++ = *s++;
}
else if (s < d)
{
// start at end of s
d = d+n-1;
s = s+n-1;
while (n--)
*d-- = *s--;
}
return
dest;
}
但是当src < des时,memcpy使用前置拷贝,memmove使用后只拷贝