一.memcpy的使用和模拟实现
1.函数原型
void* memcpy(void* destination, const void* source, size_t num);
destination是目标内存块的指针
source是源内存块的指针
num是要复制的字节数
.函数memcpy从source的位置开始向后复制 num个字节 的数据到destination指向的内存位置。
.这个函数在遇到 '\0' 的时候并不会停下来。
.如果source和destination有任何的重叠,复制的结果都是未定义的。PS:memcpy函数只关心内存块的二进制表示,不关心其所代表的数据类型,因此可能会出现类型转换问题。此外,在使用memcpy函数时需要确保目标内存块有足够的空间来存储源内存块中的数据,否则会导致内存越界错误。
2.代码使用
#include <stdio.h> #include <string.h> int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; memcpy(arr2, arr1, 20); //注意是20个字节 int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr2[i]); } return 0; }
3.memcpy的模拟实现
#include<stdio.h> void *my_memcpy(void *p1,const void *p2,int n) { int i=0; for(i=0;i<n;i++){ *(char*)p1=*(char*)p2; p1++; p2++; } } int main() { int arr1[20]={1,2,3,4,5,6,7,8,9,10}; int arr2[5]={1,2,3,4,5}; my_memcpy(arr1+3,arr2,5*sizeof(int)); int i=0; for(;i<20;i++){ printf("%d ",arr1[i]); } return 0; }
二.memmove的使用与模拟实现
1.函数原型
void * memmove ( void * destination, const void * source, size_t num );
memmove函数会将src指针指向的内存区域中的前num个字节复制到dest指针指向的内存区域中。
PS:与memcpy函数相比,memmove函数更加灵活,因为它能够处理源地址与目的地址重叠的情况。但是,由于memmove函数需要进行更多的判断和处理,所以在一些情况下,memcpy函数可能更加高效。
2.代码使用
#include <stdio.h> #include <string.h> int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; memmove(arr1+2, arr1, 20); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr2[i]); } return 0; }
3.memmove的代码模拟实现
#include<stdio.h> void *my_memmove(void *p1,const void *p2,int n) { int i=0; if(p1<p2){ for(i=0;i<n;i++){ *(char*)p1=*(char*)p2; p1++; p2++; } } else { while(n--) *((char*)p1+n)=*((char*)p2+n); } } int main() { int arr[10]={1,2,3,4,5,6,7,8,9,10}; my_memmove(arr+2,arr,4*sizeof(int)); int i=0; for(;i<10;i++){ printf("%d ",arr[i]); } return 0; }