由memcpy strcpy memmove看内存重叠

/**********************
*C语言标准库函数strcpy的一种典型的工业级的最简实现
*返回值:目标串的地址。
*对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。
*参数:des为目标字符串,source为原字符串
*/
  char strcpy ( char * des, const  char * source)
 {
  char * r=des;
   assert ((des != NULL) && (source != NULL));
  while ((*des++ = *source++)!= '\0' );
  return  r;

 }

strcpy没有内存重叠的检查,但是由于source是const的,当有内存重叠时使用strcpy函数则程序会崩溃。


void memcpy ( void *dest,const void*src,size_t count)
{
     assert (dest!=NULL && src!=NULL);
     char * tmp=dest;
     const  char * s=src;
     for ( size_t  i=0;i<count;i++)
{
     tmp[i]=s[i];
}
     return  dest;
}
memcpy也没有对内存重叠做处理,使用这个函数的时候只有程序员自己保证源地址和目标地址不重叠
为了免受内存重叠的困扰,上面可以加上assert(dst<src || src+count<=dst)加以避免。

在库函数实现时,只有memmove考虑了内存重叠,其功能与memcpy相同,但其效率会差一些
;memmove - Copy source buffer to destination buffer
;
;Purpose:
;       memmove() copies a source memory buffer to a destination memory buffer.
;       This routine recognize overlapping buffers to avoid propogation.
;       For cases where propogation is not a problem, memcpy() can be used.
;
;   Algorithm:
;
;       void * memmove(void * dst, void * src, size_t count)
;       {
;               void * ret = dst;
;
;               if (dst <= src || dst >= (src + count)) {
;                       /*
;                        * Non-Overlapping Buffers
;                        * copy from lower addresses to higher addresses
;                        */
;                       while (count--)
;                               *dst++ = *src++;
;                       }
;               else {
;                       /*
;                        * Overlapping Buffers
;                        * copy from higher addresses to lower addresses
;                        */
;                       dst += count - 1;
;                       src += count - 1;
;
;                       while (count--)
;                               *dst-- = *src--;
;                       }
;
;               return(ret);
;       }

参考:http://bbs.csdn.net/topics/390251052
http://blog.csdn.net/uusad/article/details/5273762
http://blog.csdn.net/feitianxuxue/article/details/7195158

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值