/**
* @Method: Memcpy
* @Access: public
* @Return: void *
* @Param : dst - 目的起始地址
* @Param : src - 源起始地址
* @Param : len - 所要拷贝空间大小Byte
* @Brief : 内存拷贝,实现了内存重叠和非重叠的拷贝
* @Date : 2015-8-20 FengKang
*/
void *Memcpy(void *dst, const void *src, size_t len)
{
if(NULL == dst || NULL == src)
{
return NULL;
} void *ret = dst; if(dst <= src || (char *)dst >= (char *)src + len)
{
while(len--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + ;
src = (char *)src + ;
}
}
else
{
src = (char *)src + len - ;
dst = (char *)dst + len - ;
while(len--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - ;
src = (char *)src - ;
}
}
return ret;
}

1、 这里实现的Memcpy其实是C库中的memmove的实现。实际的memcpy是不考虑内存重叠这个问题的,也就是说使用memcpy时,dst和src的地址空间最好不要重叠。

C库中memcpy的实现:

void *memcpy(void *dst, const void *src, size_t len)
{
if(NULL == dst || NULL == src) return NULL; void *ret = dst;
while(len--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + ;
src = (char *)src + ;
} return ret;
}

2、说到memcpy那就不能不说strcpy了。已知strcpy函数的原型是: 
        char * strcpy(char * dstt,const char * src); 
这里给出strcpy的一个可能实现(未考虑内存重叠)。如果要考虑内存重叠,可以像memmove一样采用逆序拷贝即可。

char *strcpy(char *dst, const char *src)
{
if(NULL == dst || NULL == src) return NULL; char *ret = dst;
while((*(dst++) = *(src++)) != '\0'); // 默认拷贝最后的'\0' return ret;
}

C++ 实现memcpy和strcpy的更多相关文章

  1. memmove、memcpy、strcpy、memset的实现

    memmove.memcpy.strcpy.memset 原型为: void *memmove( void* dest, const void* src, size_t count ); char*  ...

  2. C++:memset ,memcpy 和strcpy 的根本区别!

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h&g ...

  3. C的memcpy和strcpy的区别

    strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止) strcpy的原型为 char *strcpy(char *dest, const char *src) 而 ...

  4. 尽量少用memcpy, 多用strcpy

    一般情况下,童鞋们都喜欢用memcpy函数去传递或者备份一个数据块.这样用起来是没有多大问题的,可是如果你要用其拷贝可见字符串的时候,就用问题了,你可能拷贝到的不是你希望的字符串,甚至是原来字符串的的 ...

  5. memcpy和strcpy的区别

    strcpy和memcpy主要有以下3方面的区别. 复制的内容不同.strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组.整型.结构体.类等. 复制的方法不同.strcpy不需要指 ...

  6. memcpy 与strcpy的区别

      C/C++中mencpy的代码实现:https://www.cnblogs.com/goul/p/10191705.html C/C++中strcpy的代码实现:https://www.cnblo ...

  7. 数组复制函数memcpy和strcpy

    strcpy和memcpy主要有以下3方面的区别.1.复制的内容不同.strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组.整型.结构体.类等.2.复制的方法不同.strcpy不需 ...

  8. 自己实现memcpy,strcpy与strncpy

    内存拷贝函数 //实现拷贝不重叠的内存块 void* memcpy1(void* dst,const void* src,size_t count) { char* pTo = (char*)dst; ...

  9. [置顶] strcpy和memcpy的区别

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

随机推荐

  1. bzoj3839【Pa2013】Działka

    题目描述 平面上有n个不重复的点.每次询问一个边平行坐标轴的矩形内(包含边界)的点组成的凸包的面积.. 输入格式 第一行两个整数k,n(1<=k<=1000000,3<=n<= ...

  2. easyUI datetimebox 自定义显示格式

    http://blog.csdn.net/littlewolf766/article/details/7329123 项目里需要显示自定义显示格式,比如只显示yyy,yyyy-mm,yyyy-mm-d ...

  3. shell 循环语句

    1.while 2.for 3.until 4.select while #!/bin/bash # 显示一系列数字 count=1 while [ $count -le 6 ]; do echo $ ...

  4. Discuz!论坛基本搭建

    Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统 一.LAMP环境搭建 参考地址:http://www.cnblogs ...

  5. angularjs的Controller as

    <html ng-app="notesApp"> <head><title>Notes App</title></head&g ...

  6. JAVA-JSP动作

    动作元素基本上是预定义的功能.下表列出了可用的JSP动作 - 编号 动作 描述 1 jsp:include 在请求页面时包含一个文件. 2 jsp:useBean 查找或实例化一个JavaBean. ...

  7. bzoj千题计划166:bzoj2179: FFT快速傅立叶

    http://www.lydsy.com/JudgeOnline/problem.php?id=2179 FFT做高精乘 #include<cmath> #include<cstdi ...

  8. [HNOI 2013]切糕

    COGS 2398. [HNOI 2013]切糕 http://www.cogs.pro/cogs/problem/problem.php?pid=2398 ★★★☆   输入文件:nutcake.i ...

  9. 随机森林入门攻略(内含R、Python代码)

    随机森林入门攻略(内含R.Python代码) 简介 近年来,随机森林模型在界内的关注度与受欢迎程度有着显著的提升,这多半归功于它可以快速地被应用到几乎任何的数据科学问题中去,从而使人们能够高效快捷地获 ...

  10. 经典幻灯片插件Swiper

    照着写的demo,搞清楚什么叫分页器Pagination,什么叫nav,搞清楚DOM结构,container,wrapper之类的,就能写了.效果掉渣天! <!DOCTYPE html> ...