您的位置:首页 > 其它

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

2017-05-05 16:20 656 查看
转载: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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: