码迷,mamicode.com
首页 > 其他好文 > 详细

关于memcpy和memmove的一点说明

时间:2015-07-24 17:44:11      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

今天看到书上降到memcpy和memmove的区别才突然

发现原来两者之间有如此区别,以前只知道这两个函数是

实现同样的功能,没有接触到其不同。

 

memcpy和memmove在MSDN的定义如下:

技术分享

 

技术分享

从两者的声明来看的确没有区别,我们来看这样一个例子

 

当我们需要将char* src="abcde"这个字符串全部copy到dest中

然而src与dest在内存中大概是这样存在的:

内存地址   低------>高

 

1   src      dest
2    1    2    3    4    5      6
3  [ a ][ b ][ c ][ d ][ e ][ \0 ][  ][  ][  ][  ][  ][  ][  ]

src地址为内存1,目的地址为内存2

此时很明显内存出现了重叠,当我们拷贝字符a到第三个内存位置的时

a将覆盖src内存中的第三个字符 这种情况在memcpy未定义然而memmove

却给出了正确的处理方式

 

解决方法,试想当我们先将dest地址移动dest+n-1同时src地址移动src+n-1

这样再从src的最后一个元素开始逐个向前拷贝到dest中就完美的避免了内存

重叠导致的元素覆盖问题呢

 

 

下面我们根据memcpy和memmove给出自己的实现:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void *memcopy( void *dest, const void *src, size_t count )
 5 {
 6     if(dest==NULL||src==NULL)
 7         return NULL;
 8     char* Dest=(char*)dest;
 9     const char* Src=(char*)src;
10     
11     int i=0;
12     
13     while(i<count)
14     {
15         *Dest++=*Src++;
16         i++;
17     }
18     
19     return dest;
20 }
21 
22 void *memmove(void *dest,const void *src,size_t count )
23 {
24     if(dest==NULL||src==NULL)
25         return NULL;
26 
27     char* Dest=(char*)dest;
28     const char* Src=(char*)src;
29     
30     int i=0;
31     if(src>dest)
32     {
33         while(i<count)//正向拷贝
34         {
35             *Dest++=*Src++;
36             i++;
37         }
38     }
39     else
40     {
41         Dest=Dest+count-1;//反向拷贝
42         Src=Src+count-1;
43 
44         while(i<count)
45         {
46             *Dest--=*Src--;
47             i--;
48         }
49     }
50 
51     
52     
53     return dest;
54 }
55 
56 
57 
58 void main()
59 {
60     char dest[80];
61     memset(dest,\0,80);
62     char* src="memcpyteststring";
63     int n;
64     cout<<"How many char you want to copy from src to dest(memcpy): ";
65     cin>>n;
66     cout<<"The dest string is: "<<(char*)memcopy(dest,src,n)<<endl;
67     cout<<"How many char you want to copy from src to dest(memcpy): ";
68     cin>>n;
69     cout<<"The dest string is: "<<(char*)memmove(dest,src,n)<<endl;
70     return;
71 }

运行截图:

技术分享

 

 

关于memcpy和memmove的一点说明

标签:

原文地址:http://www.cnblogs.com/vpoet/p/4673772.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!