【FROM MSDN && 百科】

原型:  void *memmove( void* dest, const void* src, size_tcount );

#include<string.h>

由src所指内存区域复制count个字节到dest所指内存区域。

src和dest所指内存区域可以重叠,但复制后dest内容会被更改。函数返回指向dest的指针

Copies the values of num bytes from the location pointed by source to the memory block pointed by destination. Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap.

memmove的处理措施:

(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝

(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝

(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

  1. //#define FIRST_DEMO
  2. //#define SECOND_DEMO
  3. #define MYMEMMOVE
  4. #ifdef FIRST_DEMO
  5. #include <stdio.h>
  6. #include <conio.h>
  7. #include <string.h>
  8. int main(void)
  9. {
  10. char s[]="Golden Global View";
  11. memmove(s,s+7,strlen(s)+1-7);//+1是取'\0',可以去掉看下结果
  12. printf("%s\n",s);
  13. getch();
  14. return 0;
  15. }
  16. #elif defined SECOND_DEMO
  17. #include <stdio.h>
  18. #include <conio.h>
  19. #include <string.h>
  20. int main(void)
  21. {
  22. char str1[7]="aabbcc";
  23. printf( "The string: %s\n", str1 );
  24. memcpy(str1+2,str1,4);
  25. printf( "New string: %s\n", str1 );
  26. memmove(str1+2,str1,4);
  27. printf( "New string: %s\n", str1 );
  28. getch();
  29. return 0;
  30. }
  31. /*output:
  32. The string: aabbcc
  33. New string: aaaabb
  34. New string: aaaaaa
  35. */
  36. #elif defined MYMEMMOVE
  37. #include <stdio.h>
  38. #include <conio.h>
  39. #include <string.h>
  40. #include <assert.h>
  41. void *mymemmove(void *dest,const void *src,size_t coount);
  42. int main(void)
  43. {
  44. char str1[7]="aabbcc";
  45. mymemmove(str1+2,str1,4);
  46. puts(str1);
  47. getch();
  48. return 0;
  49. }
  50. void *mymemmove(void *dest,const void *src,size_t count)
  51. {
  52. char *ret=(char *)dest;
  53. char *dest_t=dest;
  54. char *src_t=(char *)src;
  55. assert( NULL !=src && NULL !=dest);
  56.  
  57. if (dest_t<=src_t || dest_t>=src_t+count)
  58. {
  59. while(count--)
  60. {
  61. *dest_t++ = *src_t++;
  62. }
  63. }
  64. else
  65. {
  66. dest_t+=count-1;
  67. src_t+=count-1;
  68. while(count--)
  69. {
  70. *dest_t--=*src_t--;
  71. }
  72. }
  73. return ret;
  74. }
  75. #endif

  

[转]memmove函数的更多相关文章

  1. memmove函数

    写一个函数,完成内存之间的拷贝 void* mymemcpy( void *dest, const void *src, size_t count ) { char* pdest = static_c ...

  2. 实现memmove函数

    分析:memmove函数是<string.h>的标准函数,其作用是把从source开始的num个字符拷贝到destination.最简单的方法是直接复制,但是由于它们可能存在内存的重叠区, ...

  3. strcpy函数;memcpy函数;memmove函数

    strcpy函数实现: char* strcpy(char* des,const char* source) { char* r=des; assert((des != NULL) && ...

  4. 面试题之实现系统函数系列一:实现memmove函数

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  5. 【C语言】模拟实现memmove函数(考虑内存重叠)

    //模拟实现memmove函数(考虑内存重叠) #include <stdio.h> #include <assert.h> #include <string.h> ...

  6. C语言memcpy()函数和memmove()函数

    C语言memcpy()函数和memmove()函数 关于 memcpy() 函数,请先看链接. memcpy() 函数和 memmove() 函数的函数原型如下: void* memcpy(void ...

  7. 一些关于memcpy memmove函数的区别,和模拟实现

    memcpy: 它是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 函数原型:void* memcp ...

  8. strcpy和memcpy,memmove函数的区别

    strcpy和memcpy的区别 strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制 ...

  9. C语言memmove()函数: 复制内存内容(可以重叠的内存块)

    头文件:#include <string.h> memmove() 用来复制内存内容,其原型为: void * memmove(void *dest, const void *src, s ...

随机推荐

  1. 【调侃】IOC前世今生(转)

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  2. Timus1132(二次剩余方程求解)

    题目:http://acm.timus.ru/problem.aspx?space=1&num=1132 题意:就是给出方程,p为素数,求在区间内的解. 这个思路很简单,详见:http://a ...

  3. 互联网组织的未来:剖析GitHub员工的任性之源

    转自:http://www.php100.com/html/it/hulianwang/2015/0108/8304.html [导读] 本文为大家介绍了著名代码托管服务商GitHub的组织运转结构. ...

  4. Ganglia监控搭建

    一.Ganglia介绍: Ganglia是一个监控服务器.集群的开源软件,能够用曲线图表现最近一个小时,最近一天,最近一周,最近一月,最近一年的服务器或者集群的cpu负载,内存,网络,硬盘等指标.Ga ...

  5. rpm常用操作

    1.查询.检查软件包 rpm {-q|--query} [select-options] [query-options] rpm {-V|--verify} [select-options] [ver ...

  6. 《ACM国际大学生程序设计竞赛题解I》——6.10

    Pku 1143: Description Christine and Matt are playing an exciting game they just invented: the Number ...

  7. Jenkins 一: 环境安装以及配置

    安装JDK 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 选择的JDK版本和开发使用的JDK版本最好 ...

  8. 80 多个 Linux 系统管理员的监控工具

    原文出处: serverdensity   译文出处:Linux中国 随着互联网行业的不断发展,各种监控工具多得不可胜数.这里列出网上最全的监控工具.让你可以拥有超过80种方式来管理你的机器.在本文中 ...

  9. hdu 3553 Just a String (后缀数组)

    hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个 ...

  10. Linux下报 java.net.SocketException权限不够 异常解决

    转载自:http://wangchongan.com/articles/java-net-socket-exception-permission-denied.html 今天在Linux下用Jetty ...