83 2.百度笔试题 memmove

来源:互联网 发布:各专业软件大全 编辑:程序博客网 时间:2024/06/06 18:07

2.百度笔试题
用C语言实现函数 void * memmove(void *dest, const void *src, size_t n) 。memmove  函
数的功能是拷贝 src  所指的内存内容前 n  个字节到 dest  所指的地址上。

/*2.百度笔试题用C语言实现函数 void * memmove(void *dest, const void *src, size_t n) 。memmove  函数的功能是拷贝 src  所指的内存内容前 n  个字节到 dest  所指的地址上。实现字节拷贝 char是字节 在C/C++标准库函数中存在该函数,它用于将src指向的n个字节的数据拷贝到dest位置。在标准库函数中还存在另外一个函数memcpy,它也用来实现内存拷贝,但它不考虑区间重叠问题,在拷贝过程中可能造成重叠错误。而memmove则针对上诉问题给出了一定的处理措施来防止拷贝出错:(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝为了防止src+n<des 有重叠 实行倒着拷贝 则不会覆盖 下面给出memmove的具体实现,关于memcpy可参考库函数实现或相关资料。*/ #include <stdio.h>#include <assert.h>void *memmove(void *dest,const void *src, size_t n)  {      if (NULL==dest|| src==NULL)      {          cerr<<"NULL pointers!";          return NULL;      }      int step;      char *p, *q;      if ((char *)src==(char *)dest) //(1)        return dest;      else if ((char *)src>(char *)dest) //(2){           step=1;          p=(char *)src;          q=(char *)dest;      } else// (3){          step=-1;          p=(char *)src+n-1;          q=(char *)dest+n-1;      }      for(int i=0;i!= n;++i){          *q=*p;          p+=step;          q+=step;      }      return dest;  } 


0 0