常见内存拷贝函数:memcpy()、memmove()、strcpy()的实现及区别

xiaoxiao2021-02-28  129

转载:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201322332592/

memcpy和memmove实现不同测试:

memcpy不考虑内存重合问题:

       即src<dest&&dest<src+n,从前往后cpoy因为重合部分内容被修改,所以复制出来的内容不正确。

       所以memcpy是正向copy n个字节的内容。

memmove考虑内存重合问题:

       即src<dest&&dest<src+n,在这种情况下memmove会从后往前copy n个字节的内容。

测试代码及结果如下:

test_memcpy.cpp: #include <stdio.h> #include <string.h> int main(int argc,char*argv[]) {         int i=0;         int a[10];         for(i=0;i<10;i++)         {                 a[i]=i;         }         memcpy(&a[4],a,6*sizeof(int));         for(i=0;i<10;i++)         {                 printf("%d ",a[i]);         }         printf("\n");         return 0; }

test_memmove.cpp: #include <stdio.h> #include <string.h> int main(int argc,char*argv[]) {         int i=0;         int a[10];         for(i=0;i<10;i++)         {                 a[i]=i;         }         //memcpy(&a[4],a,6*sizeof(int));         memmove(&a[4],a,6*sizeof(int));         for(i=0;i<10;i++)         {                 printf("%d ",a[i]);         }         printf("\n");         return 0; }

 测试结果:

     2、我们已经搞清楚了memcpy和memmove实现的不同,下面给出两个函数的实现: memcpy的实现: void *memcpy(void *dest,void *src,unsigned int n) {       if(dest==NULL||src==NULL)             return NULL;       void *ret=dest;       while(n>0)                                  //不考虑内存重合问题,正向copy n个字节       {               *(char*)dest=*(char*)src;               dest=(char*)dest+1;               src=(char*)src+1;               n--;       } } memmove的实现: void *memmove(void *dest,const void *src,unsigned int n) {     if(dest==NULL||src==NULL)          return NULL;     char *pdest=(char*)dest;     char *psrc=(char*)src;     if(pdest<psrc||pdest>psrc+n)        //内存没有重合或重合(dest<src&&dest+n>src)不影响正向copy      {             while(n--)             {                   *pdest=*psrc;                   pdest=pdest+1;                   psrc=psrc+1;             }     }     else                                              //dest>src&&dest<src+n的情况,两段内存空间有重合,从后往前copy。        {             pdest=pdest+n-1;             psrc=psrc+n-1;             while(n--)             {                   *pdest=*psrc;                   pdest=pdest-1;                   psrc=psrc-1;             }     }     return dest; } strcpy拷贝字符串的实现: strcpy和memcpy的不同是strcpy只能操作字符串,遇到'\0'就结束,并且不考虑溢出问题。 char *strcpy(char *dest,char *src) {         if(dest==NULL||src==NULL)                 return NULL;         char *ret=dest;         while((*src)!='\0')         {              *dest=*src;               dest++;               src++;         }         return dest; }
转载请注明原文地址: https://www.6miu.com/read-31865.html

最新回复(0)