memcpy和memmove的区别

以前在动态申请分配内存时,都使用memcpy,而看到别人的源码上使用的是memmove,本着一个优秀程序员的好奇心和进取心         (O(∩_∩)O哈哈~,别打我),就到网上查了查,很多网友都说是memcpy不支持overlap,memmove支持overlap。

 

MSDN上如是描述:

memmove:

Remarks

The memmove function copies count characters from src to dest.

If some regions of the source area and the destination overlap, memmove ensures that the original source characters in the overlapping region are copied before being overwritten.

 

MSDN的意思是:memmove函数从src向dest拷贝count个字符。如果如果源地区和目的地区的一些部分重叠,memmove函数能够确保源地区中初始的字符在被覆盖之前被拷贝到目的地区。

也就是说有一个字符串string a = "1234567890",要把a的子串34567890从a+2的地址拷贝到a+3的地址,想要得到这样的效果12334567890,当然计算机做这件事时,不会一次就将34567890整个放到a+3的地址后面,而是读取一个3,放到a+3,然后再读取一个4,放到a+4地址内,依次拷贝整个子串,但是值得注意的是当它执行第一动作时,读取一个3,放到a+3处,它就会将a+3中的内容4覆盖,导致下次读取4的时候出现拷贝错误,我想memmove就是避免这样的问题发生吧。

 

在VS上运行了一下MSDN的 提供的例子程序:

 int _tmain(int argc, _TCHAR* argv[])
{


char string1[60] = "The quick brown dog jumps over the lazy fox";
char string2[60] = "The quick brown fox jumps over the lazy dog";
/*                                             1         2         3         4         5
 *                           12345678901234567890123456789012345678901234567890
 */
   printf( "Function:/tmemcpy without overlap/n" );
   printf( "Source:/t/t%s/n", string1 + 40 );     /*fox*/
   printf( "Destination:/t%s/n", string1 + 16 );    /*dog jumps over the lazy fox*/
   memcpy( string1 + 16, string1 + 40, 3 );      
   printf( "Result:/t/t%s/n", string1 );      /*The quick brown fox jump over the lazy fox*/
   printf( "Length:/t/t%d characters/n/n", strlen( string1 ) ); /*43*/

   /* Restore string1 to original contents */
   memcpy( string1 + 16, string2 + 40, 3 );

   printf( "Function:/tmemmove with overlap/n" );    
   printf( "Source:/t/t%s/n", string2 + 4 );     /*quick brown fox jumps over the lazy dog*/
   printf( "Destination:/t%s/n", string2 + 10 );    /*jumps over the lazy dog*/ 
   memmove( string2 + 10, string2 + 4, 40 );     
   printf( "Result:/t/t%s/n", string2 );      /*the quick quick brown fox jumps over the lazy dog*/
   printf( "Length:/t/t%d characters/n/n", strlen( string2 ) ); /*49*/

   printf( "Function:/tmemcpy with overlap/n" );    /*quick brown dog jumps over the lazy fox*/
   printf( "Source:/t/t%s/n", string1 + 4 );    
   printf( "Destination:/t%s/n", string1 + 10 );     /*uick brown dog jumps over the lazy fox*/
   memcpy( string1 + 10, string1 + 4, 40 );
   printf( "Result:/t/t%s/n", string1 );
   printf( "Length:/t/t%d characters/n/n", strlen( string1 ) );
   system("pause");

}

 结论是:在overlap的情况下,memcpy和memmove得到的结果是一样的,接着又按照自己的如上的理解随意的改了src和dest的地址,得到的结果还是一样。我ft了,难道是MSDN描述有误,还是我对overlap的理解有误呢?如有高手看到这篇文章,请指点一二,谢谢。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值