原文: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}
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}