C++ 实现memcpy和strcpy
/**
* @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的更多相关文章
- memmove、memcpy、strcpy、memset的实现
memmove.memcpy.strcpy.memset 原型为: void *memmove( void* dest, const void* src, size_t count ); char* ...
- C++:memset ,memcpy 和strcpy 的根本区别!
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h&g ...
- C的memcpy和strcpy的区别
strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止) strcpy的原型为 char *strcpy(char *dest, const char *src) 而 ...
- 尽量少用memcpy, 多用strcpy
一般情况下,童鞋们都喜欢用memcpy函数去传递或者备份一个数据块.这样用起来是没有多大问题的,可是如果你要用其拷贝可见字符串的时候,就用问题了,你可能拷贝到的不是你希望的字符串,甚至是原来字符串的的 ...
- memcpy和strcpy的区别
strcpy和memcpy主要有以下3方面的区别. 复制的内容不同.strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组.整型.结构体.类等. 复制的方法不同.strcpy不需要指 ...
- memcpy 与strcpy的区别
C/C++中mencpy的代码实现:https://www.cnblogs.com/goul/p/10191705.html C/C++中strcpy的代码实现:https://www.cnblo ...
- 数组复制函数memcpy和strcpy
strcpy和memcpy主要有以下3方面的区别.1.复制的内容不同.strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组.整型.结构体.类等.2.复制的方法不同.strcpy不需 ...
- 自己实现memcpy,strcpy与strncpy
内存拷贝函数 //实现拷贝不重叠的内存块 void* memcpy1(void* dst,const void* src,size_t count) { char* pTo = (char*)dst; ...
- [置顶] strcpy和memcpy的区别
strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容,还会复制字符串的结束符. 已知strcpy函数 ...
随机推荐
- k最近邻算法(kNN)
from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): d ...
- PyQt5整体介绍
1 PyQt5整体介绍 PyQt5是基于图形程序框架Qt5的Python语言实现,由一组Python模块构成. PyQt5的官方网站是:www.riverbankcomputing.co.uk. Py ...
- python学习(24) 使用Xpath解析并抓取美女图片
Xpath最初用来处理XML解析,同样适用于HTML文档处理.相比正则表达式更方便一些 Xpath基本规则 nodename 表示选取nodename 节点的所有子节点 / 表示当前节点的直接子节点 ...
- etcd3集群管理
目录 在什么情况下需要集群的运行时更改 集群运行时更改的操作 更新一个节点 删除一个节点 增加一个节点 节点迁移和灾难恢复 迁移节点 灾难恢复 在什么情况下需要集群的运行时更改 维护和升级多个机器 如 ...
- bzoj千题计划133:bzoj3130: [Sdoi2013]费用流
http://www.lydsy.com/JudgeOnline/problem.php?id=3130 第一问就是个最大流 第二问: Bob希望总费用尽量大,那肯定是把所有的花费加到流量最大的那一条 ...
- springboot 以jar方式在linux后台运行
linux命令如下: nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 & 命令解释: nohup:不挂断地运行命令, ...
- 安装python包时遇到"error: Microsoft Visual C++ 9.0 is required"的简答
简答 在Windows下用pip安装Scrapy报如下错误, error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall ...
- springmvc转springboot过程中访问jsp报Whitelabel Error Page错误
前言: 虽然springboot内嵌了一个tomcat,但是这个内嵌的tomcat不支持jsp页面,所以需要引入其他包 解决: maven引入以下包即可 <dependency> < ...
- 把数组存入到cookie中
$arr = array(1,2,3); // 把数组序列化之后,存入到cookie中 $arr_str = serialize($arr); // 序列化数组 setcookie('a',$arr_ ...
- ELASTIC SEARCH 安装
elastic search 2017年3月18日 安装&使用 环境 表 1 环境信息 Centos cat /etc/issue CentOS release 6.8 (Final) cat ...