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 ...
随机推荐
- android UI库
https://github.com/wasabeef/awesome-android-ui List of Android UI/UX Libraries A curated list of awe ...
- quartz定时任务框架的使用
quartz定时任务时间设置 这些星号由左到右按顺序代表 : * * * * * * * ...
- DispatcherServlet
<servlet> <servlet-name>chapter2</servlet-name> <servlet-class>org.springfra ...
- 3D正方体
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- [bootstrap] bootstrap 简介和相关网址
Bootstrap 来自 Twitter,是目前很受欢迎的前端框架. 基于 HTML.CSS.JAVASCRIPT ,简洁灵活,使 Web 开发更加快捷. Bootstrap提供了优雅的HTML和CS ...
- python中Url链接编码处理(urlencode,urldecode)
做完了flask-web应用,这几天想用爬虫做个好玩的电影链接整合器,平时找电影都是在dytt或者dy2018之类的网站,在用dytt搜索电影<美国队长时>,发现他的搜索链接是这样的:ht ...
- hdu-------(1698)Just a Hook(线段树区间更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- js事件知识整理
鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemove 如果按下鼠标上的设备(左键,右键,滚轮……),则触发mousedown ...
- Objective-C(二、类和对象)
类和对象 #import是include的升级版,可以自动防止重复包含,所以注意:大家以后在引入头文件的时候都使用import Foundation是一个框架,Foundation.h是Founda ...
- 实例化Layout中的布局文件(xml)
什么是LayoutInflater This class is used to instantiate layout XML file into its corresponding View obje ...