关于memcpy和memmove的一点说明

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

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

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

 

memcpy和memmove在MSDN的定义如下:

关于memcpy和memmove的一点说明

 

关于memcpy和memmove的一点说明

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

 

当我们需要将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的一点说明

 

 

你可能感兴趣的:(move)