typedef unsigned int size_t;
void * my_memcpy ( void *dest, const void *src, size_t num )
{
    void* ret = dest;
    while (num--)
    {
        *(char*)dest = *(char*)src;
        dest = (;
        src = (;
    }
    return ret;
}

//to solve memory overlap
void *my_memcpy(void *dst, const void *src, size_t count)
{
     char *pdst = static_cast<char *>(dst);
     const char *psrc = static_cast<const char *>(src);  

     if (pdst > psrc && pdst < psrc + count)
     {
           ; i >= ; i--)
           {
                pdst[i] = psrc[i];
           }
     }
     else
     {
           ; i < count; i++)
           {
                pdst[i] = psrc[i];
           }
     }
     return dst;
}   

C语言中使用#include <string.h>;
C++中使用#include <cstring>和#include <string.h>都可以。
.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
注意:source和destin都不一定是数组,任意的可读写的空间均可。

6函数实现
微软中:
void*__cdeclmemcpy(
void*dst,
constvoid*src,
size_tcount
)
{
void*ret=dst;
#ifdefined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)
{
externvoidRtlMoveMemory(void*,constvoid*,size_tcount);
RtlMoveMemory(dst,src,count);
}
#else/*defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)*/
/*
*copyfromloweraddressestohigheraddresses
*/
while(count--){
*(char*)dst=*(char*)src;
dst=(;
src=(;
}
#endif/*defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)*/
return(ret);
}
coreutils中:
void*memcpy(void*destaddr,voidconst*srcaddr,size_tlen)
{
char*dest=destaddr;
charconst*src=srcaddr;
)
{
*dest++=*src++;
}
returndestaddr;
}
Linux中:
void*memcpy(void*dest,constvoid*src,size_tcount)
{
assert(dest!=NULL&&src!=NULL);
char*tmp=dest;constchar*s=src;
;i<count;i++)
{
tmp[i]=s[i];
}
returndest;
}
程序例example1
作用:将s中的字符串复制到字符数组d中。
//memcpy.c
#include<stdio.h>
#include<string.h>
intmain()
{
char*s="GoldenGlobalView";
chard[];
clrscr();
memcpy(d,s,(strlen(s)+));
printf("%s",d);
getchar();
return0;
}
输出结果:Golden Global View
example2
作用:将s中第13个字符开始的4个连续字符复制到d中。(从0开始)
#include<string.h>
intmain(
{
char*s="GoldenGlobalView";
chard[];
memcpy(d,s+,);//从第13个字符(V)开始复制,连续复制4个字符(View)
d[]='\0';//memcpy(d,s+14*sizeof(char),4*sizeof(char));也可
printf("%s",d);
getchar();
return0;
}
输出结果: View
example3
作用:复制后覆盖原有部分数据
#include<stdio.h>
#include<string.h>
intmain(void)
{
charsrc[]="******************************";
chardest[]="abcdefghijlkmnopqrstuvwxyz0123as6";
printf("destinationbeforememcpy:%s\n",dest);
memcpy(dest,src,strlen(src));
printf("destinationaftermemcpy:%s\n",dest);
return0;
}
输出结果:
destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
destination after memcpy: ******************************as6

与strcpy函数的区别
strcpy和memcpy主要有以下3方面的区别。
、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

最新文章

  1. (十八)WireShark 过滤语法
  2. android JAVA字符串转日期或日期转字符串(转)
  3. SimPholders Xcode快速访问沙盒
  4. MicroService/web Service/webAPI/RPC
  5. Hibernate,JPA注解@Version
  6. [转]ASP.NET Session 详解
  7. linux局域网不能相互访问
  8. 关于sql2005 与 myeclipse进行连接出现的小问题
  9. 201521123063 java第一周总结
  10. duilib界面库学习(仿PC微信界面,有服务器,有数据库,可以网络通信)
  11. swing 之简单登录窗体实现
  12. important的妙用解决firefox和ie的css兼容问题
  13. 用SQL表达交并差操作
  14. ASP.NET 教程汇总
  15. centos7 - mongodb3.6.5-配置文件
  16. 使用Git进行代码管理的心得--github for windows
  17. 初次启动hive,解决 ls: cannot access /home/hadoop/spark-2.2.0-bin-hadoop2.6/lib/spark-assembly-*.jar: No such file or directory问题
  18. jmeter jsr223脚本引用变量的问题
  19. Java EE之Form的get与post方法
  20. TMG2010安装配置细节设定

热门文章

  1. 【Java网络编程】基于 UDP 的聊天通信
  2. bzoj 3676 后缀自动机+马拉车+树上倍增
  3. PHP 中文字符串相关
  4. 8-13 Just Finish it up uva11093
  5. MongoDB入门教程三[数据类型]
  6. PIL 学习
  7. shell cut
  8. 转 SSM框架整合to萌新
  9. apache 监控
  10. python opencv3 窗口显示摄像头的帧