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下 它俩运行结果一样!
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下 它俩运行结果一样!
相关文章推荐
- strcpy、memcpy、memmove的区别
- memcpy、memmove、strcpy函数实现源码及区别
- memcpy和memmove的区别
- memmove和memcpy区别
- 实例介绍利用valgrind定位memcpy内存重叠问题------顺便再次说说memcpy和memmove的区别
- strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove
- memcpy和memmove的区别
- memcpy和 memmove有什么区别
- 浅谈memmove 和 memcpy的区别
- 模拟实现memcpy、memmove函数以及二者的区别
- memmove 和 memcpy的区别
- [转]memcpy和memmove的区别
- memset、memcpy、memmove的常见用法和区别,以及memcpy与strcpy的区别
- memmove 和 memcpy的区别
- memmove 和 memcpy的区别以及处理内存重叠问题
- memcpy和memmove的区别(实验代码原创)
- strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove
- memcpy和memmove的区别
- memcpy和memmove的区别
- memmove和memcpy的区别