函数原型:

  1. void* memcpy(void *dst,void const *src,size_t count)
  2. void* memmove(void *dst,void const *src,size_t count)

头文件:

  1. #include<string.h>

引入:

  字符串由'\0'结尾,所以字符串内部不能包含任何'\0'字符('\0'的ASCII值为0),否则我们将读不到'\0'后的字符内容。但是,非字符串内部包含零值的情况并不罕见,我们无法利于其它字符串函数来处理这类数据。所以,我们要引入内存操作的函数来处理。

  memcpy

memcpy函数是从src的起始位置复制count个字节到dst内存的起始位置。

我们可以利用这种方法复制任何类型的数值,但是,如果src和dst以任何形式出现了重叠,它的结果就是未定义的。所以,有内存重叠的情况时,我们要避免使用memcpy函数。

  1. //模拟memcpy源码实现
  2. void* my_memcpy(void *dst, void *src, size_t count)
  3. {
  4. assert(dst); //这里最好检测一下源和目的的合法性
  5. assert(src);
  6. char *dest = (char *)dst; //以字节为单位进行复制
  7. char *str = (char *)src;
  8. while (count--)
  9. {
  10. *dest++ = *str++;
  11. }
  12. return dst;
  13. }

  memmove

memmove函数和memcpy函数差不多,只是它的源和目标操作数可以重叠。

  1. //模拟memmove源码实现
  2. void* my_memove(void *dst, void *src, size_t count)
  3. {
  4. assert(dst);
  5. assert(src);
  6. char *dest = (char *)dst;
  7. char *str = (char *)src;
  8.  
  9. if ((dest > str) && (dest < str + count))
  10. { // 内存重叠,从后往前拷贝
  11. dest = dest + count - 1;
  12. src = src + count - 1;
  13.  
  14. while (count--)
  15. {
  16. *dest-- = *str--;
  17. }
  18. }
  19. else
  20. { //内存不重叠,相当于memcpy
  21. while (count--)
  22. {
  23. *dest++ = *str++;
  24. }
  25. }
  26. return dst;
  27. }

  

memcpy与memmove的更多相关文章

  1. memcpy vs memmove

    [本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...

  2. memcpy与memmove的区别

    在面试中经常会被问道memcpy与memove有什么区别? 整理如下: 其实主要在考C的关键字:restrict C库中有两个函数可以从一个位置把字节复制到另一个位置.在C99标准下,它们的原型如下: ...

  3. C语言实现memcpy和memmove

    0.两者比较: memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被 ...

  4. memcpy、memmove、memset及strcpy函数实现和理解

    memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...

  5. 关于memcpy和memmove的一点说明

    今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同. memcpy和memmove在MSDN的定义如下: 从两 ...

  6. strcpy()、memcpy()、memmove()、memset()的内部实现

    一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...

  7. 第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())

    /*----------------------------------------- mems.c -- 使用 memcpy() 和 memmove() ---------------------- ...

  8. 模拟实现memcpy 与 memmove

    模拟实现memcpy 与 memmove 1.str系列的函数只能处理字符串——>必须带有'\0'2.memcpy内存处理函数:不涉及'\0',需要包含头文件 string.h3.source的 ...

  9. memcpy、memmove、memset、memchr、memcmp、strstr详解

    第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...

  10. C/C++之Memcpy and memmove

    memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...

随机推荐

  1. 用ActivatedRoute获取url中的参数

    突然让我用ActivatedRoute import {Injectable} from "@angular/core"; import {ActivatedRoute} from ...

  2. c# 扩展方法奇思妙用基础篇八:Distinct 扩展

    刚看了篇文章 <Linq的Distinct太不给力了>,文中给出了一个解决办法,略显复杂. 试想如果能写成下面的样子,是不是更简单优雅 var p1 = products.Distinct ...

  3. unity3d面试题与参考答案

    1.C#程序题 1 2 3 4 5 6 7 8 9 10 11 private static void aaa(int x) { x = 10; }   private static void bbb ...

  4. SQL金典

    ps:补充自己的基础知识,大神请无视.. ~~~~~~~~~~~~~~~~~~~~~ DataBase Management System,DBMS.... Catalog ...库 Table... ...

  5. [Python2.x] 利用commands模块执行Linux shell命令

    用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要 ...

  6. eclipse 4.3 汉化

    打开浏览器,浏览“参考资料”内给出的“eclipse语言包下载”地址,在博客新页面找到地址链接,如图所示.“Babel Language...”开头的一栏下面就是各个eclise版本的语言包,此处以I ...

  7. 集成 SOLR 到 TOMCAT 中(傻瓜教程)

    按照如下配置,整个 Solr 是绿色版的,可以将 Tomcat 目录复制到任何一个地方运行 1.下载 solr 4.3 版本 2.下载 Tomcat 7 ( 6 也可以),另外可以根据系统下载 32 ...

  8. SQL Server 还原错误“restore database正在异常终止 错误 3154”

    今天在还原数据库时,先建立相同名字的数据库,然后在该数据库上右键还原数据库.遇到了这样的一个错误: “备份集中的数据库备份与现有的 'RM_DB' 数据库不同. RESTORE DATABASE 正在 ...

  9. Rikka with Subset

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  10. 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)

    [题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...