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

原文:http://www.cppblog.com/zenliang/articles/131782.html

根据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}
原文地址:https://www.cnblogs.com/black/p/2793224.html