memcpy 与 memmove 区别

http://blog.csdn.net/lwbeyond/article/details/6830424

memcpy() -- 拷贝内存内容

表头文件: #include <string.h>
定义函数: void *memcpy(void *dest, const void *src, size_tn)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束''而结束
返回值:   返回指向dest的指针
附加说明: 指针src和dest所指的内存区域不可重叠

重叠的例子:

[cpp] view plain copy
 
  1. #include <string.h>  
  2. #include <stdio.h>  
  3.   
  4. int main()  
  5. {  
  6.   int i = 0;  
  7.   int a[10];  
  8.   
  9. /*0 1 2 3 4 5 6 7 8 9 */  
  10.   for(i; i < 10; i++)  
  11.   {  
  12.     a[i] = i;  
  13.   }  
  14.   
  15. /*首先a[0]->a[4],但是a[4]再次操作时出现的重叠*/  
  16.   memmove(&a[4], a, sizeof(int)*6);    
  17.   
  18. /*0 1 2 3 0 1 2 3 0 1 不可以内存重叠*/  
  19.   for(i = 0; i < 10; i++)  
  20.   {  
  21.     printf("%d ",a[i]);  
  22.   }  
  23.   
  24.   printf(" ");  
  25. }  


memmove() -- 拷贝内存内容

表头文件: #include <string.h>

定义函数: void *memmove(void *dest, const void *src, size_t n);

函数说明:memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。

不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。

返回值: 返回指向dest的指针。附加说明: 指针src和dest所指的内存区域可以重叠。

重叠的例子:

[cpp] view plain copy
 
  1. <pre name="code" class="plain">#include <string.h>  
  2. #include <stdio.h>  
  3.   
  4. int main()  
  5. {  
  6.   int i = 0;  
  7.   int a[10];  
  8.   
  9. /*0 1 2 3 4 5 6 7 8 9 */  
  10.   for(i; i < 10; i++)  
  11.   {  
  12.     a[i] = i;  
  13.   }  
  14.   
  15. /*首先a[0]->a[4],但是a[4]再次操作时出现的重叠*/  
  16.   memmove(&a[4], a, sizeof(int)*6);    
  17.   
  18. /*0 1 2 3 0 1 2 3 4 5 可以内存重叠*/  
  19.   for(i = 0; i < 10; i++)  
  20.   {  
  21.     printf("%d ",a[i]);  
  22.   }  
  23.   
  24.   printf(" ");  
  25. }</pre>  
  26. <pre></pre>  
  27. <br>  
  28. <span style="font-size:18px">有时VC和GCC结果显示二者一样,这是因为编译器都优化成了可以考虑内存重叠的情况。</span><strong><span style="font-size:18px"><br>  
  29. </span></strong><br>  
原文地址:https://www.cnblogs.com/honeybusybee/p/5257810.html