经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++中memcpy函数的使用以及模拟实现
来源:jb51  时间:2022/7/19 9:55:46  对本文有异议

前言

memcpy函数如何使用,以及如何实现我们自己的my_memcpy在这里给大家详细介绍。

一、什么是memcpy

memcpy是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

二、memcpy与strcpy的区别

1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2.复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3.用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

1.strcpy

  1. int main()
  2. {
  3. char arr1[] = "abcdef";
  4. char arr2[20] = { 0 };
  5. strcpy(arr2, arr1);
  6. printf("%s", arr2);
  7. return 0;
  8. }

这里我们可以看到字符串arr1已经被拷贝

我们再看一下下面的代码

  1. int main()
  2. {
  3. int arr1[] = { 1,2,3,4,5 };
  4. int arr2[5] = { 0 };
  5. printf("%s", arr2);
  6. return 0;
  7. }

这时我们发现arr2就不能正常的拷贝了,因为strcpy只能拷贝字符串,int类型的数组或者结构体都是不能拷贝的,因为strcpy比较依赖’\0’通过检测‘\0’来实现函数的,这时就需要我们的memcpy函数了。

2.memcpy

在这里插入图片描述

我们这里简单介绍一下函数的使用,函数的三个参数分别是dest(要复制的目的地),str(原目标),count(要复制内容的大小)。

  1. struct S
  2. {
  3. char name[10];
  4. int age;
  5. };
  6. int main()
  7. {
  8. struct S arr1[] = {{"ajd",20},{"qwe",18}};
  9. struct S arr2[3] = { 0 };
  10. memcpy(arr2, arr1, sizeof(arr1));
  11. return 0;
  12. }

这里我们通过memcpy函数成功复制了结构体arr1。

在这里插入图片描述

三、模拟实现memcpy

  1. void* my_memcpy(void* dest, const void* src, size_t num)
  2. {
  3. assert(dest && src);
  4. void* ret = dest;
  5. while (num--)
  6. {
  7. *(char*)dest = *(char*)src;
  8. ++(char*)dest;
  9. ++(char*)src;
  10. }
  11. return ret;
  12.  
  13. }
  14. struct S
  15. {
  16. char name[10];
  17. int age;
  18. };
  19. int main()
  20. {
  21. struct S arr1[] = {{"ajd",20},{"qwe",18}};
  22. struct S arr2[3] = { 0 };
  23. my_memcpy(arr2, arr1, sizeof(arr1));
  24. return 0;
  25. }

这里我们模拟实现了memcpy函数。

在这里插入图片描述

总结

这些memcpy函数的全部内容了,主要就是讲解它的使用,以及我们自己如何去实现它,更多相关C++ memcpy函数内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号