蜗牛的家
男儿当自强
posts - 48,  comments - 21,  trackbacks - 0
 1 void   *memmove(void   *s1,   const   void   *s2,   register   size_t   n)   
 2 {   
 3     register   char   *p1   =   s1;   
 4     register   const   char   *p2   =   s2;   
 5     
 6     if   (n>0)   {   
 7         if   (p2   <=   p1   &&   p2   +   n   >   p1)   {   
 8             /*   overlap,   copy   backwards   */   
 9             p1   +=   n;   
10             p2   +=   n;   
11             n++;   
12             while   (--n   >   0)   {   
13                 *--p1   =   *--p2;   
14             }   
15         }   else   {   
16             n++;   
17             while   (--n   >   0)   {   
18                 *p1++   =   *p2++;   
19             }   
20         }   
21     }   
22     return   s1;   
23 }   
24 
25 void   *memcpy(void   *s1,   const   void   *s2,   register   size_t   n)   
26 {   
27     register   char   *p1   =   s1;   
28     register   const   char   *p2   =   s2;   
29     
30     
31     if   (n)   {   
32         n++;   
33         while   (--n   >   0)   {   
34             *p1++   =   *p2++;   
35         }   
36     }   
37     return   s1;   
38 }
posted on 2008-10-15 10:31 黑色天使 阅读(2697) 评论(5)  编辑 收藏 引用 所属分类: C\C++

FeedBack:
# re: memcpy的BUG
2008-10-15 12:58 | len
你只在摘要写了说明性文字,正文忘了写了吧
  回复  更多评论
  
# re: memcpy的BUG
2008-10-15 17:16 | Mensch88
也不能算BUG吧?memcpy的设计就是不考虑overlap情况。毕竟这种情况是极少数,memcpy的效率要比memmove高。
而且人家也说了,如果可能出现overlap,就不应该用memcpy,而应该用memmove函数来处理。
这其实是程序员应该考虑的事情,安全vs效率,不同情况使用不同的函数。  回复  更多评论
  
# re: memcpy的BUG
2008-10-17 20:00 | charwin
没记错的话,好像size_t是无符号的吧! line 33死循环~~  回复  更多评论
  
# re: memcpy的BUG
2008-10-21 23:39 | Etrnls
这年头还真罕见用register的  回复  更多评论
  
# re: memcpy的BUG[未登录]
2008-11-24 00:44 | noname
33行--到0就跳了吧,负以后虽然因为size_t类型转成最大32位数,但没有再次循环吧  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜