memcpy缺陷探讨
来源:互联网 发布:狄奥多拉知乎 编辑:程序博客网 时间:2024/06/03 22:49
前一篇文章描述了memcpy的实现方法,本文将探讨下memcpy运用中存在的缺陷,即memcpy不能拷贝目的地址(dest)和源地址(src)内存空间有重合的部分,更为确切的说应该是当目的地址大于源地址的时候,不能够有重合部分,否则源地址重合部分数据会发生错误
以下分析只考虑目的地址和源地址有数据重合情况,在没有数据重合情况的时候,memcpy是能够正确的使用,不会出现错误
1、当目的地址(dest)小于源地址(src)且有数据重合的时候,如下图所示
黄色部分则是dest和src数据重合部分,为什么说当目的地址小于源地址且有重合部分的时候memcpy还能够正确的拷贝呢?我们知道memcpy都是从目的地址和源地址开始进行拷贝的,也就是说当拷贝目的地址增长到了源地址开始处的时候,源地址以前的数据已经拷贝完成了,因此,能够正确的进行数据拷贝。如下图所示
当dest增长到前一张图片的src开始位置的时候,此处的源地址的数据已经进行了拷贝,因此说当目的地址小于源地址且有数据重合的时候memcpy能够进行数据拷贝
下面我们来探讨另一种情况,当源地址小于目的地址且有数据重合的时候,如下图所示
当我们把源数据(src)拷贝到目的地址(dest)的时候,比如我们在src处拷贝一个字节到dest处的时候,我们发现目的地址开始处,即源地址和目的地址重合部分数据被破坏,如下图所示
当我们拷贝数据1、2、3到目的地址的开始三个地方,即存了4、5、6的时候,发现源地址的最后结束的4、5、6三个数据被破坏掉了,因此,下次拷贝该三个地址的数据时候,则会拷贝坏掉的数据1、2、3
总结以上两种情况可以发现,memcpy能够实现前向拷贝(即从高地址拷贝数据到低地址),不能够实现后向拷贝(即从低地址拷贝数据到高地址),那么,我们怎么实现后向拷贝呢? 即memmove函数的实现,下篇文章进行探讨。
- memcpy缺陷探讨
- 关于memcpy函数探讨
- 探讨AsyncTask的缺陷
- 探讨AsyncTask的缺陷
- 关于函数snprintf的缺陷探讨
- 小型团队之CVS和缺陷跟踪简单探讨【原创】
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷 .
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- Android多线程任务优化1:探讨AsyncTask的缺陷
- biology_虚拟细胞生物学
- 如何架设你自己的个人网站
- 切向量和梯度的关系
- c++基础知识2
- Oracle expdp/impdp导出导入命令
- memcpy缺陷探讨
- Given a sequence of numbers (or array).Find the maximum distance between all the same numbers.
- 折磨我的Mantis安装记二
- Xmanager的xbrowser登陆图形界面
- Windows7部署android开发环境
- Android 4.0 WIFI初始化与启动流程
- I9300工程代码
- boa配置
- 1、初识backbone.js