memcpy的用法及实现
memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,返回dest所指内存地址的起始位置。
#include <string.h> #include <stdio.h> #include <stdlib.h> void* Memcpy(void *dst, const void *src, size_t size) { if((dst==NULL)||(src==NULL)) return NULL; char *pd=(char *)dst,*ps=(char *)src; while(size--) *pd++ = *ps++; return dst; } int main() { char str[100]; gets(str); Memcpy(str+3,str,6); puts(str); return 0; }
输入abcedfghi,我们期望得到的结果是abcabcdef,但是输出的却是abcabcabc。
仔细分析下会发现是因为复制过程中abc覆盖了edf,等到本要用edf覆盖ghi时却用abc覆盖了ghi,因此得到了abcabcabc。
因此对于上面这种情况我们要倒着复制。但其实这样还是不够的。
对于str=abcdefghi内存重叠有两种情况。
1.str->str+3 ,n=6
重叠结果(从前往后拷) abcabcabc
不重叠结果(从后往前拷) abcabcdef
2.str+3->str , n=6
重叠结果(从后往前拷) ghighighi
不重叠结果(从前往后拷) defghighi
总结一下内存重叠的时候:
如果是前面的内存要复制到后面的内存,那么每次移动的时候应该倒序复制字节。
如果是后面的内存复制到前面的内存,那么每次移动的时候应该正序复制字节。
实现代码:
#include <string.h> #include <stdio.h> #include <stdlib.h> void* Memcpy(void *dst, const void *src, size_t size) { if((dst==NULL)||(src==NULL)) return NULL; char *pd,*ps;//为什么要定义char指针,因为char指针每次自加都是变化一个字节 if(dst>src&&(char*)dst<(char*)src+size) //保证是 str->str+3 这种情况,原串起点小于目标串起点且目标串起点小于原串终点 { pd=(; ps=(; while(size--) *pd--=*ps--; } else { pd=(char*)dst; ps=(char*)src; while(size--) *pd++=*ps++; } return dst; } int main() { ]; gets(str); Memcpy(str+,str,); puts(str); ; }
如有错误,欢迎指出。
参考http://baike.baidu.com/view/736225.htm?fr=aladdin
memcpy的用法及实现的更多相关文章
- memcpy函数用法
memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memc ...
- memcpy的用法总结
1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...
- 转: memcpy的用法总结
1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...
- 转:memcpy的用法总结
1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...
- memset,memcpy,memcmp用法
void* memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值. 例如:memset(lpMyStruct ...
- C函数之memcpy()函数用法
函数原型 void *memcpy(void*dest, const void *src, size_t n); 功能 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始 ...
- 转载------------C函数之memcpy()函数用法
转载于http://blog.csdn.net/tigerjibo/article/details/6841531 函数原型 void *memcpy(void*dest, const void *s ...
- C中memcpy函数用法
1.函数原型 void *memcpy(void *destin,void *source,unsigned n); 其中, destin代表用于存储复制内容的目标数组,类型强制转换为void*指针. ...
- memcpy函数的用法以及实现一个memcpy函数
memcpy的用法 在项目中经常用到memcpy来实现内存的拷贝工作,如下代码片段 memcpy( pData, m_pSaveData_C, iSize * sizeof( unsigned sho ...
随机推荐
- 韩系高端PK:whoo后VS雪花秀(转载)
产品广告代言人是李英爱(韩剧“大长今”的扮演者)产品设计也是贵妇风格.------------//就是大长今的女主角用过的牌子 LG旗下的WHOO后 WHOO后洁面霜:这是我非常喜欢的洁面霜,淡黄色 ...
- DHV 平常语言对话 一次聚会离场
一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...
- Nginx + Tomcat 配置
Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍.1.启 ...
- 记一次基于Unity的Profiler性能分析
A. WaitForTargetFPS: Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间 B. Overhead: Profiler总体时间-所有单项的记录时间总和.用于 ...
- NOIP 2014 普及组 T3 螺旋矩阵
[题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...
- Ajax发送和接收请求
首先Ajax的不刷新页面提交数据 基本上浏览器能接收的信息,Ajax都可以接收,ex:字符串,html标签,css标签,xml格式内容,json格式内容等等..... <script> / ...
- MyBatis实体类映射文件模板
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC " ...
- hdu 1695 GCD(莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Xcode8 及iOS10适配问题汇总
上点干货,目前得知的一些bug解决汇总:iOS10相册相机闪退bughttp://www.jianshu.com/p/5085430b029fiOS 10 因苹果健康导致闪退 crashhttp:// ...
- BZOJ4006 [JLOI2015]管道连接
裸的状压DP 令$f_S$表示包含颜色集合S的最小斯坦纳生成森林的值,于是有: $$f_S=\min\{f_S,f_s+f_{S-s}|s\subset S\}$$ 然后嘛...还是裸的斯坦纳树搞搞. ...