关于memcpy函数

一朋友问我memcpy如何写? 初时感到愕然,C库中不是有吗? 后来才知道原来是某公司考题。查看了一下要求,呵呵,要求的已经不是原来的memcpy函数了。尝试写出,欢迎高手拍砖:

#define  N  4

#pragma pack(N)

void *memcpyy(void* dest,const void* src,size_t n)

{  

//判断初始指针  

assert((NULL != dest)&&(NULL != src));

 if (0 == n){return dest;}

 if(dest == src){return dest;}  

//保护原指针不动  

byte *pD = (byte*)dest;  

const byte *pS = (const byte*)src;

 size_t i,num,residue;

 // 相比源指针,目标指针在低位,此时可能发生重叠,由高位到低位逆序拷贝

 if (dest>src)

 {   

pD += n-1;   pS += n-1;   

for (i=0;i<N;i++)

  {  

  if (0 == (size_t)pD%N)  

  {     

break;    

}

   *pD-- = *pS--;   

}   

pD -= 3;  

 pS -= 3;

  num = (n-i)/N;   

residue = (n-i)%N;   

size_t *pdest = (size_t*)pD;   

size_t *psrc = (size_t*)pS;   

while(num--)  

 {    

*pdest-- = *psrc-- ;  

 }   

if (0 != residue)   

{   

 pD = (unsigned char*)(++pdest) - 1;    

pS = (const unsigned char*)(++psrc) - 1;  

  for (i=residue;i>0;i--)  

  {    

 *pD-- = *pS-- ;  

  }

  }   

}  

// 相比源指针,目标指针在高位,此时由低位到高位顺序拷贝就可

 else

 {   

for (i=0;i<N;i++)   

{    

if (0 == (size_t)pD%N)   

 {    

 break;   

 }    

*pD++ = *pS++ ;   

}   

num = (n - i )/N;   

residue = (n - i)%N;   

size_t* pdest = (size_t*)pD;   

size_t* psrc = (size_t*)pS;  

   while (num--)   

{    

*pdest++ = *psrc++ ;  

 }  

 if (0 != residue)  

 {    

pD = (unsigned char*)pdest;   

 pS = (const unsigned char*)psrc;   

 for (i=0;i<residue;i++)   

 {     

*pD++ = *pS++;  

  }  

 }

 }  

return dest;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值