您的位置:首页 > 其它

memcpy和memmove的区别??

2011-09-17 21:12 197 查看
#include<iostream>
using namespace std;
int main()
{
int a[10];
for(int i=0;i<10;i++)
a[i]=i;
memcpy(&a[4],a,sizeof(int)*6);
for(i=0;i<10;i++)
cout<<a[i]<<endl;
}

很简单的小程序!不过已经足以达到我的目的了:)将上面代码gcc之后再运行,结果为:0 1 2 3 0 1 2 3 0 1 。
再把第13行改成:memmove(&a[4], a, sizeof(int)*6),重新gcc再运行,结果为:0 1 2 3 0 1 2 3 4 5 !
呵呵,两者的区别出现了。不过其实这样还不够,继续修改13行: memmove(a, &a[4], sizeof(int)*6) //也就是将源、目的置换一下而已
重新gcc编译再运行,结果为:4 5 6 7 8 9 6 7 8 9 。
还不够,继续修改13行为: memcpy(a, &a[4], sizeof(int)*6); gcc并运行,结果仍为: 4 5 6 7 8 9 6 7 8 9 !
至此真相已经大白了。对比上面四个结果,不难得出以下结论:
1. 当 src 和 dest 所指内存区有重叠时,memmove 相对 memcpy 能提供保证:保证能将 src 所指内存区的前 n 个字节正确的拷贝到 dest 所指内存中;
2. 当 src 地址比 dest 地址低时,两者结果一样。换句话说,memmove 与 memcpy 的区别仅仅体现在 dest 的头部和 src 的尾部有重叠的情况下;
memcpy

memcpy是把source 指向的对象中的n个字符拷贝到destin所指向的对象中,返回指向结果对象的指针。
memmove也是把source 指向的对象中的n个字符拷贝到destin所指向的对象中,但过程就好象是先把source所指向的对象拷贝到临时数组中,然后在从临时数组拷贝到destin所指的对象中,返回指向结果对象的指针。
但要注意,除memmove之外的字符串操作函数在拷贝同一个字符串中的字符时,其结果是不确定的。也就是说,memmove可以把自己的一部分拷贝给自己的另一部分。

vc下 它俩运行结果一样!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: