欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > c语言内存函数memcpy,memmove,memcmp

c语言内存函数memcpy,memmove,memcmp

2024/10/24 1:54:07 来源:https://blog.csdn.net/2401_83201682/article/details/143098153  浏览:    关键词:c语言内存函数memcpy,memmove,memcmp

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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com