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. 《javascript高级程序设计》第七章 递归recursion

    7.1 递归7.2 闭包 7.2.1 闭包与变量 7.2.2 关于this 对象 7.2.3 内存泄漏 7.3 模仿块级作用域7.4 私有变量 7.4.1 静态私有变量 7.4.2 模块模式 7.4. ...

  2. (32)odoo中的编码问题

    对于全部是英文就不存在问题,但我们常用中文,这样会导致一个棘手的问题 约定: 系统Ubuntu trusty14.04 自带python2.7.6 python2.7.9 自己升级了 升级方法: -- ...

  3. java(课程设计之记事本界面部分代码公布)

    代码:涉及记事本的一些界面......!! /* *java课程设计之记事本(coder @Gxjun) * 编写一个记事本程序 * 要求: * 用图形用户界面实现. * 能实现编辑.保存.另存为.查 ...

  4. Mybatis update In

    mysql语句如下: ,,) mybatis的mapper如下: int updateStateByIDs(@Param("ids") String[] ids, @Param(& ...

  5. 【转】Session ID/session token 及和cookie区别

    Session + Cookie  知识收集! cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决 ...

  6. CI框架 数据库批量插入 insert_batch()

    使用CI框架的AR操作:insert_batch()可以减少访问数据库的次数.一次访问即可. 示例1: $data = array( array( 'title' => 'My title' , ...

  7. syslog简介——系统日志写入API

    一.简介 syslog是Linux系统默认的日志守护进程.默认的主配置文件和辅助配置文件分别是/etc/syslog.conf和/etc/sysconfig/syslog文件.通常,syslog 接受 ...

  8. excel快捷键设置

    Excel技能 按键 结果 序号 Alt+1 合并后居中 1 ALT+2 边框 2 ALT+3 边框线型 3 ALT+4 格式刷 4 ALT+5 清除格式 5 CTRL+SHIFT+P 设置字体 6 ...

  9. [转]何时使用委托而不使用接口(C# 编程指南)

    以下内容转自MSDN:http://msdn.microsoft.com/zh-cn/library/ms173173.aspx 委托和接口都允许类设计器分离类型声明和实现. 任何类或结构都能继承和实 ...

  10. J2EE开发实战基础系列一 HelloWorld【转】

      开始咱们的第一个程序,首先是配置环境,按照上一章所描述的方式下载开发工具,然后配置Java环境变量,给大家看下具体的结构: 环境变量配置OK的提示,如上图. Eclipse和Tomcat的文件目录 ...