memmove、memcpy、strcpy

memmove、memcpy、strcpy

strcpy只能处理字符串;如果拷贝带有特殊字符的串,就只能用memcpy或memmove。
memcpy和memmove功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行。

memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,其原型分别如下:


void   * memcpy( void   * dst,  const   void   * src, size_t count);
void   * memmove( void   * dst,  const   void   * src, size_t count);

它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果是一样的,但如果有交叉呢?先看下图:

memmove、memcpy、strcpy_第1张图片



图的上半部分为源内存区域在目标内存区域右边,下半部分为源内存区域在目标区域左边,源内存区域和目标内存区域都有交叉。

memcpy()是从src的起始部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,如图所示,后两个字节在被复制前已经被覆盖掉了。而memmove()则由于采用了不同的复制机制,所以可以正确处理第二种情况。


下面是两个函数的源码实现:

 1  void   *  __cdecl memcpy ( void   *  dst,  const   void   *  src, size_t count)
 2  {
 3           void   *  ret  =  dst;
 4
 6           while  (count -- ) {
 7                   * ( char   * )dst  =   * ( char   * )src;
 8                  dst  =  ( char   * )dst  +   1 ;
 9                  src  =  ( char   * )src  +   1 ;
10          }
11 
12           return (ret);
13  }


 1
  void   *  __cdecl memmove ( void   *  dst,  const   void   *  src, size_t count)
 2  {
 3           void   *  ret  =  dst;
 4 
 5           if  (dst  <=  src  ||  ( char   * )dst  >=  (( char   * )src  +  count)) {
 6                  
 7                   while  (count -- ) {
 8                           * ( char   * )dst  =   * ( char   * )src;
 9                          dst  =  ( char   * )dst  +   1 ;
10                          src  =  ( char   * )src  +   1 ;
11                  }
12          }
13           else  {
14                  
15                  dst  =  ( char   * )dst  +  count  -   1 ;
16                  src  =  ( char   * )src  +  count  -   1 ;
17 
18                   while  (count -- ) {
19                           * ( char   * )dst  =   * ( char   * )src;
20                          dst  =  ( char   * )dst  -   1 ;
21                          src  =  ( char   * )src  -   1 ;
22                  }
23          }
24 
25           return (ret);
26  }

你可能感兴趣的:(memmove、memcpy、strcpy)