赞
踩
作者:旧梦拾遗186
每日励志:
要想在人生中获胜,就要比别人更早地努力。而要及早努力,需要及早地为自己的人生做出规划,做好人生定位
前言:
今天小编带大家认识一下memcpy函数。注意:VS里面memcpy超额完成了,也有memmove的功能(那么memmove)又是什么我们下回分解。
目录
注意:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 '\0' 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
4.VS里面memcpy超额完成了,也有memmove的功能(那么memmove)又是什么我们下回分解
- #include <stdio.h>
- #include <string.h>
- struct {
- char name[40];
- int age;
- } person, person_copy;
- int main()
- {
- char myname[] = "Pierre de Fermat";
-
- memcpy(person.name, myname, strlen(myname) + 1);
- person.age = 46;
-
- memcpy(&person_copy, &person, sizeof(person));
- printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
- return 0;
- }
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个字节,在结构体拷贝时需要包含结构体中字符的字节数。
- #include<stdio.h>
- #include<string.h>
- int main()
- {
- int arr1[8] = { 1,1,2,3 };
- int arr2[] = { 5,6,7,8 };
- memcpy(arr1, arr2, 16);
- for (int i = 0; i < 4; i++)
- {
- printf("%d", arr1[i]);
- }
- return 0;
- }
本题可以理解为在数组arr1的首地址向后打印16个字节;
你以为这就完了?
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<stdio.h>
- #include<assert.h>
- void/***/ my_memcpy(void* arr1, void* arr2, size_t num)
- {
- assert(arr1 && arr2);
- void* ret = arr1;
- while (num--)
- {
- *(char*)arr1 = *(char*)arr2;
- arr1 = (char*)arr1 + 1;
- arr2 = (char*)arr2 + 1;
- }
- /*return ret;*/
-
- }
-
- int main()
- {
- int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
- int arr2[] = { 9,10,11 };
- my_memcpy(arr1, arr2, 12);
- for (int i = 0; i < 10; i++)
- {
- printf("%d", arr1[i]);
- }
- return 0;
- }
值得注意的是这里是一个字节一个字节的运动。
注意:
1.形参是用void* char来接收的这样不管使用这不管传进的是什么类型都可以接收
2.指针在移动时也会一个字节一个字节的运动这样不管使用者使用什么类型进行拷贝,可都可以实现。
除此
之外还有些错误的示范
注意:
模拟函数在拷贝时同一字符串时会被覆盖
- #include<stdio.h>
- #include<assert.h>
- void/***/ my_memcpy(void* arr1, void* arr2, size_t num)
- {
- assert(arr1 && arr2);
- void* ret = arr1;
- while (num--)
- {
- *(char*)arr1 = *(char*)arr2;
- arr1 = (char*)arr1 + 1;
- arr2 = (char*)arr2 + 1;
- }
- /*return ret;*/
-
- }
-
- int main()
- {
- int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
-
- my_memcpy(arr1+2, arr1, 12);
- for (int i = 0; i < 10; i++)
- {
- printf("%d", arr1[i]);
- }
- return 0;
- }
结语:
每个人的成长都是能力和想要得到的东西,不断匹配的过程,当你的才华和欲望不匹配时,你就该静下心来学习了,如果小编的总结能对你有所帮助,希望小伙伴们三连加关注哦,你的支持是小编创作的最大动力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。