模拟实现内存函数memcpy,memmove
前言
了解内存函数,模拟实现内存函数.
一、了解memcpy函数
中文名: 内存拷贝函数
功能: 拷贝n个字节
外文名: memcpy
所在头文件: <string.h>或<cstring>
返回值: 指向dest的指针
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //内存操作函数 //memcpy #include<string.h> int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; memcpy(arr2, arr1, 20); int i = 0; for (i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++) { printf("%d", arr2[i]); } return 0; }
模拟实现memcpy函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> //模拟实现memcpy函数 void* my_memcpy(void *dest,const void *src,int num) { assert(dest && src); void* ret = dest; while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; //还有另外一种写法但一定要注意优先级 //*((char*)dest)++ = *((char*)src)++; } return ret; } #include<string.h> int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; my_memcpy(arr2, arr1, 20); int i = 0; for (i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++) { printf("%d", arr2[i]); } return 0; }
分析
while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; //还有另外一种写法但一定要注意优先级 //*((char*)dest)++ = *((char*)src)++; }
拷贝的时候不知道拷贝数据和被拷贝的数据类型,所以统一都强制类型转换成char*.
二.了解memmove函数
函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> //memcpy函数应该拷贝不重叠内存 //memmove函数可以处理内存重叠的情况 int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; memmove(arr1 + 2, arr1, 20); int i = 0; for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++) { printf("%d",arr1[i]); } return 0; }
模拟实现memmove函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<assert.h> //memcpy函数应该拷贝不重叠内存 //memmove函数可以处理内存重叠的情况 //模拟实现memmove void* my_memmove(void *dest,const void *src,size_t num) { void* ret = dest; if (dest < src) { //从前向后拷贝 while (num--) { *(char*)dest = *(char*)src;//强制类型转换 dest = (char*)dest + 1; src = (char*)src + 1; //*((char*)dest)++=*((char*)src)++//还可以写成这样 } } else { //从后向前拷贝 while (num--) { *((char*)dest + num) = *((char*)src + num); } } return ret; } int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 }; my_memmove(arr1 + 2, arr1, 20); int i = 0; for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++) { printf("%d",arr1[i]); } printf(" "); return 0; }
分析
拷贝时的两种情况
1.当dest<src,我们将数据从前往后进行拷贝.这样不会出现数据被覆盖的情况.
2.当dest>src,我们将数据从后往前进行拷贝.
总结
了解内存函数,模拟实现内存函数.