当前位置:   article > 正文

memcpy函数(多积累进大厂)

memcpy

作者:旧梦拾遗186

专栏:C语言编程----小比特成长日记

每日励志:

要想在人生中获胜,就要比别人更早地努力。而要及早努力,需要及早地为自己的人生做出规划,做好人生定位

前言:

今天小编带大家认识一下memcpy函数。注意:VS里面memcpy超额完成了,也有memmove的功能(那么memmove)又是什么我们下回分解。

目录

一.功能:

二.代码1:

1.结果:

2.解释:

三.代码2: 

1.结果:

 2.解释:

四.模拟代码实现:


一.功能:

注意:

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 

2.这个函数在遇到 '\0' 的时候并不会停下来。

3.如果source和destination有任何的重叠,复制的结果都是未定义的。

4.VS里面memcpy超额完成了,也有memmove的功能(那么memmove)又是什么我们下回分解

二.代码1:

  1. #include <stdio.h>
  2. #include <string.h>
  3. struct {
  4. char name[40];
  5. int age;
  6. } person, person_copy;
  7. int main()
  8. {
  9. char myname[] = "Pierre de Fermat";
  10. memcpy(person.name, myname, strlen(myname) + 1);
  11. person.age = 46;
  12. memcpy(&person_copy, &person, sizeof(person));
  13. printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
  14. return 0;
  15. }

1.结果:

2.解释:

 1.memcpy(person.name, myname, strlen(myname) + 1);

第一个函数person.name取得是结构体中的数组的首地址,myname,取得是自定义数组的首地址,strlen(myname) + 1,代表要拷贝17个字节而每个字母又是一个字节,所以可以讲自定义数组myname全部拷贝到person.name中。

2. memcpy(&person_copy, &person, sizeof(person));

第二个函数&person_copy取得是数组中整型age的地址,&person取得是自定义结构体中age的地址,而sizeof(person)代表向后拷贝44个字节,在结构体拷贝时需要包含结构体中字符的字节数。

三.代码2: 

  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5. int arr1[8] = { 1,1,2,3 };
  6. int arr2[] = { 5,6,7,8 };
  7. memcpy(arr1, arr2, 16);
  8. for (int i = 0; i < 4; i++)
  9. {
  10. printf("%d", arr1[i]);
  11. }
  12. return 0;
  13. }

1.结果:

 2.解释:

本题可以理解为在数组arr1的首地址向后打印16个字节;

你以为这就完了?

四.模拟代码实现:

1.代码:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<assert.h>
  4. void/***/ my_memcpy(void* arr1, void* arr2, size_t num)
  5. {
  6. assert(arr1 && arr2);
  7. void* ret = arr1;
  8. while (num--)
  9. {
  10. *(char*)arr1 = *(char*)arr2;
  11. arr1 = (char*)arr1 + 1;
  12. arr2 = (char*)arr2 + 1;
  13. }
  14. /*return ret;*/
  15. }
  16. int main()
  17. {
  18. int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
  19. int arr2[] = { 9,10,11 };
  20. my_memcpy(arr1, arr2, 12);
  21. for (int i = 0; i < 10; i++)
  22. {
  23. printf("%d", arr1[i]);
  24. }
  25. return 0;
  26. }

2.结果:

3.图解:

值得注意的是这里是一个字节一个字节的运动。 

注意:

1.形参是用void* char来接收的这样不管使用这不管传进的是什么类型都可以接收

2.指针在移动时也会一个字节一个字节的运动这样不管使用者使用什么类型进行拷贝,可都可以实现。

除此

 之外还有些错误的示范

五.错误示范:

注意:

模拟函数在拷贝时同一字符串时会被覆盖

  1. #include<stdio.h>
  2. #include<assert.h>
  3. void/***/ my_memcpy(void* arr1, void* arr2, size_t num)
  4. {
  5. assert(arr1 && arr2);
  6. void* ret = arr1;
  7. while (num--)
  8. {
  9. *(char*)arr1 = *(char*)arr2;
  10. arr1 = (char*)arr1 + 1;
  11. arr2 = (char*)arr2 + 1;
  12. }
  13. /*return ret;*/
  14. }
  15. int main()
  16. {
  17. int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
  18. my_memcpy(arr1+2, arr1, 12);
  19. for (int i = 0; i < 10; i++)
  20. {
  21. printf("%d", arr1[i]);
  22. }
  23. return 0;
  24. }

 

结语:

 每个人的成长都是能力和想要得到的东西,不断匹配的过程,当你的才华和欲望不匹配时,你就该静下心来学习了,如果小编的总结能对你有所帮助,希望小伙伴们三连加关注哦,你的支持是小编创作的最大动力。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/997101
推荐阅读
相关标签
  

闽ICP备14008679号