/**
* @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. 解题:USACO13JAN Island Travels

    题面 好像没啥可说的,就当练码力了...... 先用BFS跑出岛屿,然后跑最短路求岛屿间的距离,最后状压DP得出答案 注意细节,码码码2333 #include<set> #include ...

  2. 【裴蜀定理】【CF1091C】 New Year and the Sphere Transmission

    Description 有 \(n\) 个人围成一个圈,按照顺时针从 \(1\) 到 \(n\) 编号.第 \(1\) 个人会拿到一个球,他指定一个数字 \(k\),然后会将球传给他后面顺指针数第 \ ...

  3. UIScrollview 与 Autolayout 的那点事

    原文  http://www.cocoachina.com/ios/20151221/14757.html 前言 自从写了 介绍Masonry 那篇文章以后 就一直有人对UIScrollView的那个 ...

  4. 十、Shell基础

    一.shell概述 1.Shell是什么 shell是一个命令行解释器,他为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至编写一些程序 ...

  5. Java入门:使用Java API

    什么是Java类库 在编写程序的时候,通常有很多功能是通用的,或者是很基础的,可以用这些功能来组成更发杂的功能代码.比如文件操作,不同程序对文件的操作基本都是一样的,打开文件,关闭文件,读取文件里面的 ...

  6. Python【requests】第三方模块

    import requests print("===============get请求================")url = 'http://api.nnzhp.cn/ap ...

  7. Hadoop生态圈-hive编写自定义函数

    Hadoop生态圈-hive编写自定义函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  8. 3.Filter和interceptor的区别

    https://blog.csdn.net/qq_36411874/article/details/53996873

  9. 2017 国庆湖南 Day1

    卡特兰数 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ] ...

  10. [转载]Getting Started with ASP.NET vNext and Visual Studio 14

    说在转载之前的话:ASP.NET框架之前不断做大,而vNext则是从头开始,对ASP.NET框架进行拆分并瘦身,面对不同的需求而更加灵活,各个拆分出来的模块更加轻量.vNext的出现,对ASP.NET ...