编写memcpy函数

memcpy函数,这个题算法简单明确,因此重点考察编程习惯、工程思想。 该题目的算法如下 

void  memcpy(void *dst, void *src, int count) 

{  

while(count--)     

 

         *dst = *src; 

         dst++; 

         src++;  

  }  

}  

32位系统中,可复制的最多内存是多少?类型会不会不够用?内存复制不应该修改原始内存吧。 

因此,函数声明修改如下 void memcpy(void *dst, const void *src, size_t count)  这样就万事大吉了吗?如果传入了空指针呢? 接着修改吧 

void memcpy(void *dst, const void *src, size_t count)

 {  

     assert(dst != NULL);  

     assert(src != NULL);  

     unsigned char *pdst = (unsigned char *)dst;  

     const unsigned char *psrc = (const unsigned char *)src; 

     while(count--)      

    {  

         *pdst = *psrc;  

          pdst++;      

        psrc++;     

  

如果有这样的数组char ina[]={0,1,2,3,4,5,6,7,8,9,10,11}; 进行如下调用memcpy(&ina[1], &ina[0], 5);会发生什么情况?由于原始数据和目的数据在空间上存在重叠,这样导致复制过程中不可避免会对原始数据做修改。而这样的修改在函数的声明中是看不到的(const void *src)。如果降低要求,可以修改原始数据完成复制,那么这样的设计能实现么?这里有一个版本可供参考。但是这样的实现使得函数的功能不明确,可以认为是一种异常情况。 

void memcpy(void *dst, const void *src, size_t count)  

{  

       assert(dst != NULL); 

     assert(src != NULL);  

       unsigned char *pdst = (unsigned char *)dst;  

       const unsigned char *psrc = (const unsigned char *)src;  

       assert(!(psrc<=pdst && pdst<psrc+count));//判断是否有重叠 

       assert(!(pdst<=psrc && psrc<pdst+count));  

      while(count--) 

     

         *pdst = *psrc; 

          pdst++;  

          psrc++;  

     }

 }  

到这里实现已经比较健壮了。有些人想要链式的调用函数,也就是复制完内存后,返回值直接当做其他函数的参数。 

void * memcpy(void *dst, const void *src, size_t count)  最终版本为 

void* memcpy(void *dst, const void *src, size_t count)  

{  

     assert(dst != NULL);  

     assert(src != NULL);  

     unsigned char *pdst = (unsigned char *)dst;  

     const unsigned char *psrc = (const unsigned char *)src;

     assert(!(psrc<=pdst && pdst<psrc+count));

     assert(!(pdst<=psrc && psrc<pdst+count)); 

     while(count--) 

     {  

         *pdst = *psrc; 

         pdst++;

         psrc++; 

     } 

    return dst;

 }

猜你喜欢

转载自blog.csdn.net/liuxiao19890212/article/details/39692801