1.memcpy的使用和模拟实现
void * memcpy(void* destination,const void * source,size_t);
目标地址 源空间地址 被拷贝字节的个数
void* 返回的是目标函数的起始地址,可接受任意指针参数的类型,无具体类型的 指针
函数memcpy从source的位置开始向后复制num个字节的数据到dasetination指向的内存位置
这个函数在遇到 '\0' 的时候并不会停下来
如果source和destination有任何的重叠,复制的结果都是未定义的
memcpy的使用
#include<stdio.h>
#include<cstring>
int main()
{int arr1[]={1,2,3,4,5,6,7,8,9,10};int arr2[20]={0};//将arr1中的3,4,5,6,7拷贝放到arr2中//从3开始拷贝到arr2,20个字节就是5个整形 memcpy(arr2,arr1+2,20); for(int i=0;i<10;i++){printf("%d ",arr2[i]);//打印出拷贝后的数 }return 0;
}
memcpy的模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void * dest,const void* src,size_t num)
{void * ret=dest;assert(dest&&src);//assert断言判断两个数组不为空 for(int i=0;i<num;i++){//强制转换成char类型,因为用int的话当是17个字节是不好进行拷贝 *(char*)dest=*(char*)src;//不写成(char*)dest++,是应为强制类型转换都是临时的dest =(char*)dest+1;//一旦使用++则dest不再是char*类型而是void*类型 src=(char*)src+1;}return ret;
}
int main()
{int arr1[]={1,2,3,4,5,6,7,8,9,10};int arr2[20]={0};my_memcpy(arr2,arr1+2,17);for(int i=0;i<10;i++){printf("%d ",arr2[i]);}return 0;
}
memcpy函数不负责重叠内存的拷贝,只负责不重叠内存的拷贝。重叠的可以用memmove
2.memmove函数的使用和模拟实现
void * memmove(void * deatination,const void* source,size_t num)
和memcpy的差别就是memmove函数处理的原内存块和目标内存是可以重叠的
如果原空间和目标空间出现重叠,就得使用memmove函数处理
memmove的使用
#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); //从第三个开始拷贝到自身的5个整数 for(int i=0;i<10;i++){printf("%d ",arr1[i]);//打印出拷贝后的数 }return 0;
}
因为可以进行重叠拷贝 ,分为两种情况
从前往后进行拷贝
当dest大于src的时候,为了避免重复,就从前往后重叠
从后往前进行拷贝
当的dest小于src的时候,就从后往前进行重叠
memmove函数的模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memmove(void * dest,const void* src,size_t num)
{void * ret=dest;assert(dest&&src);//assert断言判断两个数组不为空 if(dest<src)//从前往后 {while(num--)//限制条件的就是字节的个数 {*(char*)dest=*(char*)src;dest=(char*)dest+1;src=(char*)src+1;}}else//从后往前 {while(num--){*((char*)dest+num)=*((char*)src+num);}}return ret;
}
int main()
{int arr1[]={1,2,3,4,5,6,7,8,9,10};my_memmove(arr1,arr1+2,20);//将从第三个开始拷贝五个到前五个 for(int i=0;i<10;i++){printf("%d ",arr1[i]);}return 0;
}
3.memset函数的使用
void * memset(void* ptr,int value,size_t num );
memset 是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。
#include<stdio.h>
#include<string.h>
int main()
{char str[]="hello world";memset(str,'x',6);//将6个字符x复制给str前6个字符 printf(str); return 0;
}
4.memcmp的使用
int memcmp(const void* ptr1,const void *ptr2,size_t num);
比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
#include<stdio.h>
#include<string.h>
int main()
{int arr1[]={1,2,3,4,5};//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00int arr2[]={1,2,3,5,6}; //01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00 06 00 00 00int ret=memcmp(arr1,arr2,13);//从第十三个字节开始就不一样了,返回值为-1 printf("%d\n",ret); return 0;
}