模拟实现memcopy()/memmove()
来源:互联网 发布:txt文档编辑软件 编辑:程序博客网 时间:2024/05/19 18:41
memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:
void *memcpy(void *dst, const void *src, size_t count);void *memmove(void *dst, const void *src, size_t count);
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
memcpy:memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
memmove:memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集
memmove在复制两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些。
下面给出两个函数的模拟实现:
void* my_memcopy(void* dest, const void* src, size_t n){assert(dest);assert(src);char* pdest = (char *)dest;const char* psrc = (char *)src;while (n--){*pdest++ = *psrc++;}return dest;}void* my_memmove(void* dest, const void* src, size_t n){assert(dest);assert(src);char* pdest = (char *)dest;const char* psrc = (char *)src;if (pdest <= psrc || psrc + n <= pdest){while (n--){*pdest = *psrc++;}}else{while (n--){*(pdest + n) = *(psrc + n);}}return dest;}
阅读全文
0 0
- 模拟实现memcopy()/memmove()
- memmove,memcopy区别和实现
- memmove,memcopy区别和实现
- memmove,memcopy区别和实现
- memmove & memcopy ~~~
- memcopy 和 memmove 的实现与区别
- 【C语言】实现memcopy、memmove函数
- memcopy 和memmove
- memmove、memcpy,memcopy简介
- memcopy和memmove 区别
- MemCopy与MemMove
- memmove 和 memcopy
- memmove 和 memcopy
- memmove 和 memcopy
- memmove 和 memcopy
- memmove 和 memcopy
- memmove 和 memcopy
- 模拟实现memmove函数
- 通讯录程序的改进——文件备份
- spring boot 下错误页面处理
- Java中Array与ArrayList的主要区别
- cookie、 sessionStorage 、localStorage之间的区别和使用
- Linux重要命令
- 模拟实现memcopy()/memmove()
- 树莓派内核编译与固件升级
- 华为底部虚拟导航栏挡住布局
- 正则表达式
- 微信关注回复消息
- Ruby Gem 开发入门(一)
- Spring 依赖注入
- maven-javadoc插件避免thrift生成代码注释不完整
- FreeRTOS系列学习笔记三---FreeRTOS内核详解LIST(9.0版本)