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的用法及实现的更多相关文章

  1. memcpy函数用法

    memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memc ...

  2. memcpy的用法总结

    1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...

  3. 转: memcpy的用法总结

    1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...

  4. 转:memcpy的用法总结

    1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...

  5. memset,memcpy,memcmp用法

    void* memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值. 例如:memset(lpMyStruct ...

  6. C函数之memcpy()函数用法

    函数原型 void *memcpy(void*dest, const void *src, size_t n); 功能 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始 ...

  7. 转载------------C函数之memcpy()函数用法

    转载于http://blog.csdn.net/tigerjibo/article/details/6841531 函数原型 void *memcpy(void*dest, const void *s ...

  8. C中memcpy函数用法

    1.函数原型 void *memcpy(void *destin,void *source,unsigned n); 其中, destin代表用于存储复制内容的目标数组,类型强制转换为void*指针. ...

  9. memcpy函数的用法以及实现一个memcpy函数

    memcpy的用法 在项目中经常用到memcpy来实现内存的拷贝工作,如下代码片段 memcpy( pData, m_pSaveData_C, iSize * sizeof( unsigned sho ...

随机推荐

  1. jquery 全选功能

    1.直接全选(复选框名字要统一) <input type="CHECKBOX" id="cbSelectAll" onclick="$('inp ...

  2. as3中的多线程

    从fp11.4开始支持worker技术, 即as3中的线程概念, 到了fp11.5, flascc中开始支持pthread家族来创建线程. 总的来说, as3中有两种创建线程的方法: 1.直接在as3 ...

  3. @ExceptionHandler

    @Controller public class AccessController { /** * 异常页面控制 * * @param runtimeException * @return */ @E ...

  4. SpringMVC--xxx.xml配置

    <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servl ...

  5. Android Snackbar

    使用Snackbar我们可以在屏幕底部(大多时候)快速弹出消息,它和Toast非常相似,但是它更灵活一些. 当它显示一段时间后或用户与屏幕交互时它会自动消失. 可以自定义action-可选操作. sw ...

  6. 双日历插件--jq datepicker时间范围选择

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. Java的内存回收机制

    原文出处: cnblogs-小学徒V 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C ...

  8. 编码规范<1>

    目录: 1 排版 2注释 3标识命名 4可读性 1排版 1-1程序使用UTF-8的编码方式 1-2使用空格作为缩进 , 尽量不要使用tab 1-3相对独立的程序块之间,变量说明之后必须加空格 . 例如 ...

  9. javascript实现对象的继承的方式

    在JavaScript将原型链作为实现继承的主要方法.基本原理是利用原型让一个subType引用superType的属性和方法 推荐链接 http://www.jb51.net/article/204 ...

  10. 关于C语言和汇编语言相互嵌套调用

    1.C嵌套汇编 首先说一下关于GCC编译嵌有汇编语言的c语言吧,GCC编译的汇编语言不是我们上课时学的Intel x86汇编,而是AT&T汇编,两者的区别可以查看<Gcc使用的内嵌汇编语 ...