memcpy()和memmove()函数的原型如下:

void * memcpy ( void * dst, const void * src, size_t num );

void * memmove ( void * dst, const void * src, size_t num );

1 相同点

1.1 通常函数的参数都有具体的类型,而这里的两个函数的参数和返回值都是void,其实就是内存块(字节序列)的复制或移动(函数名字的mem是memory的缩写),有点泛型的味道,不像字符串拷贝函数,指定的是C风格字符数组类型。

1.2 两者都位于头文件中,当然除了字符串的复制,也可以复制其它数据类型,例如整体复制一个结构体(见后面的例子)。

1.3 函数不检查源中是否有任何终止的空字符(terminating null character),它总是精确地复制num字节。

1.4 为了避免溢出(overflows),目标参数和源参数指向的空间至少应为num字节。

2 区别

memcpy():复制内存块(Copy block of memory),直接复制(directly copy),因为是直接复制,所以不应重叠(overlap),对于重叠的内存块,memmove是一种更安全的方法。

memmove():移动内存块(Move block of memory),复制就像使用了中间缓冲区(intermediate buffer)一样进行(其实质是比较两块内存的首地址,进行前向或后向复制(移动一下两个指针)),允许目标和源重叠。

3 使用实例

3.1 memcpy():

#include #include struct {  char name[40];  int age;} person, person_copy;int main (){  char myname[] = "Pierre de Fermat";  /* using memcpy to copy string: */  memcpy ( person.name, myname, strlen(myname)+1 );  person.age = 46;  /* using memcpy to copy structure: */  memcpy ( &person_copy, &person, sizeof(person) );  printf ("person_copy: %s, %d ", person_copy.name, person_copy.age );  return 0;}// Output: person_copy: Pierre de Fermat, 46

3.2 memmove():

/* memmove example */#include #include int main (){  char str[] = "memmove can be very useful......";  memmove (str+20,str+15,11);  puts (str);  return 0;}// Output:memmove can be very very useful.

4 memmove()的实现

memmove()函数原型:void *memmove(void *dest, const void *src, size_t n)。

其功能是拷贝src所指向内存内容前n个字节到dest所指的地址上。

由于数据类型不确定,可以以字符为单位进行拷贝,这是因为字符可以扩展为任何一种数据类型,且每一种数据类型大小都是字符大小的倍数。

考虑到两块内存重叠的情况,需要考虑以下三点:

(1)当目标内存的首地址等于源内存的首地址时,不进行任何拷贝;

(2)当目标内存的首地址小于源内存的首地址时,正向拷贝,即从src拷贝到src + n;

(3)当目标内存的首地址大于源内存的首地址时,移动指针,反向拷贝,即从src+n反向拷贝到src;

#include#include#includevoid* memmove(void* dst, const void* src, size_t n){    char* d       = (char*)dst;     // 按字节为单位进行操作    const char *s = (const char*)src;    if (ds) // 当目标地址在源地址后面时,移动指针,反向拷贝    {        d = d+n-1;        s = s+n-1;        while (n--)*d-- = *s--;    }    return dst;}int main(){char src[100] = "Hello World!";memmove(src + 4, src, strlen(src) + 1);printf("%s",src); system("pause");return 0;}// 输出:HellHello World!

-End-

memcpy 头文件_C|memcpy()和memmove()的比较及实现相关推荐

  1. strstr函数头文件_C语言(函数)学习之strstr strcasestr

    一.strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include [3] 函 ...

  2. c语言exit在哪个头文件_C语言函数执行成功时,返回1和返回0,究竟哪个好?

    基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会 ...

  3. sizeof 头文件_c/c++基础之sizeof用法

    在 C/C++ 中,sizeof() 是一个判断数据类型或者表达式长度的运算符. 1 sizeof 定义 sizeof 是 C/C++ 中的一个操作符(operator),返回一个对象或者类型所占的内 ...

  4. c malloc 头文件_C 数据类型

    在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式. C 中的类型可分为以下几种: 序号 类型与描述 1 基本类型 ...

  5. c malloc 头文件_C语言提高篇_malloc,realloc和calloc的区别

    1.malloc() 在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址. 其函数原型为void *malloc(unsigned int ...

  6. c++ cout头文件_C/C++知识分享:C++常用内置函数你会几个,使用过几次呢?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Regina520 在 C++ 中,除了可以创建各种函数,还包含了各 ...

  7. 使用map的find头文件_C++ map用法

    C++ 中 map 提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次:第二个称之为该关键字的对应值.在一些程序中 ...

  8. c malloc 头文件_C/C++笔试题:主要考察C/C++语言基础概念算法及编程,附参考答案...

    1.编写my_strcpy函数,实现与库函数strcpy类似的功能,不能使用任何库函数: 答:char *strcpy(char *strDest, const char *strSrc) { if ...

  9. 使用map的find头文件_C++ map的基本操作和使用

    1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 自 ...

最新文章

  1. Linux6.4通过PXE网络装机
  2. OpenGL shader interpolation 着色器插值的实例
  3. window10系统 同时安装支持 jdk 1.7和1.8环境
  4. 使用Google GSON:额外的赠品:第一部分
  5. 如果在这样的环境中写代码,会不会很高效
  6. 笨方法学python(本文为阅读时从此书摘录的笔记) 第五天
  7. Java的native方法-----你必须要知道的JAVA知识
  8. 关于TTThumbsViewController加载更多
  9. 蓝桥杯 ADV-237 算法提高 三进制数位和
  10. badusb代码_badusb攻击代码
  11. Matlab 绘制直方图、面积图、饼图、针状图
  12. PIXHAWK飞行模式
  13. RTU和DTU的区别是什么?
  14. 阅读分享——李开复老师《开工愉快:如何保持每天精力充沛》
  15. python编程助手_用Python做一个久坐提醒小助手的示例代码
  16. 各地2022年上半年软考考试疫情防控要求汇总-2022-05更新
  17. 南华大学计算机学院赵畅,资源环境与安全工程2020年“砥砺六十载,逐梦新时代”元旦师生联欢会顺利举办...
  18. 测试中的指数爆炸问题
  19. 4800u功耗测试软件,ryzen controller---移动端锐龙处理器解锁功耗工具(附使用方法)...
  20. 学姐的大厂面试总结,想进大厂的必看!!!

热门文章

  1. 虚拟搭建局域网模拟器_接上U盘就能构建虚拟局域网!蒲公英X5路由器使用体验分享...
  2. android广播面试题,Android相关面试题
  3. python print %s 号格式化输出
  4. Python基础教程:list和tuple
  5. 基于Django的乐观锁与悲观锁解决订单并发问题的一点浅见
  6. mysql 备库 hang住_mysql主键的缺少导致备库hang住
  7. java调用spark_spark中的并行方法调用以及传递方法中使用spark会话
  8. 坦克大战c语言程序贴吧,坦克大战!
  9. opencv cv::mat::data是什么数据类型?
  10. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)