库函数memcpy()与memmove()实现
来源:互联网 发布:弹指神功打字软件 编辑:程序博客网 时间:2024/05/21 08:43
根据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
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
- 库函数memcpy()与memmove()实现
- 库函数memcpy()与memmove()实现
- memcpy 与 memmove 实现
- memcpy与memmove的实现
- memcpy与memmove的实现
- memcpy与memmove的实现
- 【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
- 关于实现memcpy和memmove两个库函数的一点体会
- 字符串库函数strcpy strcmp strstr memcpy memmove等的实现
- 关于实现memcpy和memmove两个库函数的一点体会
- 自己实现的库函数(memset,memcmp,memcpy,memmove)
- 模拟实现C库函数:strchr、strcmp、strstr、memcpy和memmove
- memcpy和memmove的区别与实现
- memcpy和memmove的区别与实现
- memcpy和memmove的区别与实现
- strcpy、memcpy与memmove的实现
- memcpy,memset,memmove的使用与实现
- memcpy与memmove区别和实现
- 如何使Linux系统上的程序开机后自动运行
- GNUplot 代码札记
- 功力恢复第四天
- 写给自己---我为什么要考研
- 面试题1:作用域
- 库函数memcpy()与memmove()实现
- 正则表达式30分钟入门教程
- Windows 时间同步
- 如何使Linux系统上的程序开机后自动运行(补)
- IE7关闭窗口提示问题
- java7 新特性
- 单循环链表
- 六大OO设计原则
- JDBC的批量处理与数据库连接池