库函数memcpy()与memmove()实现

根据MSDN文档,当源区域与目标区域存在重叠时,memcpy()函数报错,而memmove()函数可以处理重叠情况!
 1/* 
 2 * 函数名: memcpy 
 3 * 功  能: 从源source中拷贝n个字节到目标destin中 
 4 * 用  法: void *memcpy(void* destin, const void* source, size_t n); 
 5 * 说  明: 内存拷贝
 6*/

 7
 8#include <stdio.h> 
 9#include <conio.h>   //getch头文件
10#include <assert.h>  //assert头文件
11
12typedef unsigned char byte
13//typedef unsigned int size_t;
14
15
16/*
17memcpy函数,如果内存重叠则报错
18*/

19//src要保留
20void* memcpy(void* dst,const void* src,size_t count) 
21{
22    byte* pbTo = (byte*)dst; 
23    byte* pbFrom = (byte*)src; 
24    assert(dst!= NULL && src != NULL);//不能存在空指针
25    assert(pbTo >= pbFrom+count || pbFrom >= pbTo + count);//防止内存重叠(overlap) 
26    while (count-- > 0
27    
28        *pbTo++ = *pbFrom++
29    }
 
30    return dst; 
31}

32
33/*
34memmove函数,考虑了内存重叠的情况
35*/

36//src可以不保留
37void* memmove(void* dst,const void* src,size_t count) 
38{     
39    byte* pbTo = (byte*)dst; 
40    byte* pbFrom = (byte*)src; 
41    assert(dst != NULL && src != NULL);//不能存在空指针
42    if (dst <= src || pbTo >= pbFrom + count)// 
43    
44        while (count-- > 0
45        
46            *pbTo++ = *pbFrom++; //按递增拷贝
47        }
 
48    }
 
49    else  //
50    
51        pbTo = pbTo + count -1;//overlap的情况,从高位地址向低位拷贝 
52        pbFrom = pbFrom + count -1
53        while (count-- > 0
54        
55            *pbTo-- = *pbFrom--; //按递减拷贝
56        }
 
57    }
 
58    return dst; 
59}

60
61
62

posted on 2010-10-29 20:06 oliver 阅读(3079) 评论(2)  编辑 收藏 引用 所属分类: C/C++

评论

# re: 库函数memcpy()与memmove()实现[未登录] 2013-10-06 18:19 gong

博主,您好!这里为何还要判断pbTo >= pbFrom + count呢?  回复  更多评论   

# re: 库函数memcpy()与memmove()实现 2015-04-20 22:16 qweqwe

如果内存重叠,应该是pbTo<=pbFrom+count||pbFrom<=pbTo+count吧  回复  更多评论   


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


<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿

随笔档案

文章分类

文章档案

个人专栏

技术网站

搜索

最新评论

阅读排行榜

评论排行榜