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 ...
随机推荐
- jquery 全选功能
1.直接全选(复选框名字要统一) <input type="CHECKBOX" id="cbSelectAll" onclick="$('inp ...
- as3中的多线程
从fp11.4开始支持worker技术, 即as3中的线程概念, 到了fp11.5, flascc中开始支持pthread家族来创建线程. 总的来说, as3中有两种创建线程的方法: 1.直接在as3 ...
- @ExceptionHandler
@Controller public class AccessController { /** * 异常页面控制 * * @param runtimeException * @return */ @E ...
- SpringMVC--xxx.xml配置
<!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servl ...
- Android Snackbar
使用Snackbar我们可以在屏幕底部(大多时候)快速弹出消息,它和Toast非常相似,但是它更灵活一些. 当它显示一段时间后或用户与屏幕交互时它会自动消失. 可以自定义action-可选操作. sw ...
- 双日历插件--jq datepicker时间范围选择
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Java的内存回收机制
原文出处: cnblogs-小学徒V 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C ...
- 编码规范<1>
目录: 1 排版 2注释 3标识命名 4可读性 1排版 1-1程序使用UTF-8的编码方式 1-2使用空格作为缩进 , 尽量不要使用tab 1-3相对独立的程序块之间,变量说明之后必须加空格 . 例如 ...
- javascript实现对象的继承的方式
在JavaScript将原型链作为实现继承的主要方法.基本原理是利用原型让一个subType引用superType的属性和方法 推荐链接 http://www.jb51.net/article/204 ...
- 关于C语言和汇编语言相互嵌套调用
1.C嵌套汇编 首先说一下关于GCC编译嵌有汇编语言的c语言吧,GCC编译的汇编语言不是我们上课时学的Intel x86汇编,而是AT&T汇编,两者的区别可以查看<Gcc使用的内嵌汇编语 ...