memcpy和memmove

函数原型:

void *memcpy(void *dest, const void *src, size_t n)

void *memmove(void *dest, const void *src, size_t n)

两者的功能基本相同,唯一不同的是,当 dest 和 src 有重叠的时候选用不同的函数可能会造成不同的结果。

memcpy的原理是从src的低地址开始到高地址,单个字节复制,如果src与dest有重叠,并行src的地址低于dest的话,将会得不到想要的结果,如果src的址高于dest的话,则不会出现这种情况:


实例:

#include <iostream>
#include <string.h>

using namespace std;
int main(void)
{
int i = 0;
int a[10];
//init

for (; i < 10; i ++)
{
a[i] = i;

}

//copy
memcpy(&a[4], a, sizeof(int) * 6);

//output
for (i = 0; i < 10; i ++)
{
cout<<”a["<<i<<"]:”<<a[i]<<endl;
}

return 0;

}


输出结果为:

a[0]:0
a[1]:1
a[2]:2
a[3]:3
a[4]:0
a[5]:1
a[6]:2
a[7]:3
a[8]:0
a[9]:1

将第17行改为memmove(&a[4], a, sizeof(int) * 6),结果如下:

a[0]:0
a[1]:1
a[2]:2
a[3]:3
a[4]:0
a[5]:1
a[6]:2
a[7]:3
a[8]:4
a[9]:5

看一下memcpy与memmove的实现

代码:

void* memcpy(void* dest, void* source, size_t count)

{

void* ret = dest;

//memcpy只是简单的字节copy,没有处理重叠的情况

while (count--)

*dest++ = *source;

return ret;

}




void* memmove(void* dest, void* source, size_t count)

{

void* ret = dest;

if (dest <= source || dest >= (source + count))

{

//如果没有重叠或是有重叠重目标地址低于源地址

//从低地址开始复制

while (count--)

*dest++ = *source++;

}

else

{

//如果有重叠且目标地址高于源地址

//从高地址开始复制

dest += count - 1;

source += count - 1;

while (count--)

*dest-- = *source--;

}

return ret;

}


[color=white]作者:翁志艺[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值