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使用后只拷贝
本文对比了memcpy与memmove在处理内存重叠时的行为差异,特别是在源与目标内存区域部分或全部重叠的情况下。通过具体实例展示了两种函数的实现方式及其结果的不同。

被折叠的 条评论
为什么被折叠?



