memcpy实现
2015-09-07 09:25
204 查看
如何实现memcpy?
很容易想到的是:
void memcpy(void *dst,const void* src,size_t count)
{
assert((!dst) && (!src));
const char* psrc = (const char*)src;
char* pdst = (char*)dst;
int i=0;
for(i=0;i<count;i++)
pdst[i] = psrc[i];
}
但是会出现问题:
![](http://img.blog.csdn.net/20150907093147561?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当src和dst重合的时候
1.src > dst 这种情况的时候,从前向后copy没有问题
2.但是dst > src && dst < src +count 从前向后copy会造成重复数据的丢失
解决方法:从后向前copy
void memcpy(void *dst,cosnt void *src,size_t count)
{
assert((!dst) && (!src));
const char* psrc = (const char*) src;
char* pdst = (char*)dst;
int i=0;
if(pdst > psrc && pdst < psrc + count)
{
for(i=count-1;i>=0;i++)
pdst[i] = psrc[i];
}
else
{
for(i=0;i<count;i++)
pdst[i] = psrc[i];
}
}
很容易想到的是:
void memcpy(void *dst,const void* src,size_t count)
{
assert((!dst) && (!src));
const char* psrc = (const char*)src;
char* pdst = (char*)dst;
int i=0;
for(i=0;i<count;i++)
pdst[i] = psrc[i];
}
但是会出现问题:
当src和dst重合的时候
1.src > dst 这种情况的时候,从前向后copy没有问题
2.但是dst > src && dst < src +count 从前向后copy会造成重复数据的丢失
解决方法:从后向前copy
void memcpy(void *dst,cosnt void *src,size_t count)
{
assert((!dst) && (!src));
const char* psrc = (const char*) src;
char* pdst = (char*)dst;
int i=0;
if(pdst > psrc && pdst < psrc + count)
{
for(i=count-1;i>=0;i++)
pdst[i] = psrc[i];
}
else
{
for(i=0;i<count;i++)
pdst[i] = psrc[i];
}
}
相关文章推荐
- 九月A股调整步入深水区 投资者静待时机较为宜
- C++ 防 陷阱0 宏定义
- [leetcode-149]Max Points on a Line(java)
- iOS:KVO的概述与使用
- SQL Server Express MDF 替换问题
- PLSQL DEV工具导入dmp数据文件
- 运行时库
- 自动化测试 之亡羊补牢编
- hpp 和 h 区别
- 【哥德巴赫猜想】POJ Goldbach's Conjecture 2262
- 不要阻挡我偷懒,你肯定喜欢的软件
- ibooking项目设计介绍(一个基于SSH的外卖点餐系统)
- Mac maven 的安装
- 修改linux系统时间的方法(date命令)
- powerdesigner显示列描述信息
- Android Weight 使用 详解
- 《有朝一日》
- 14个Xcode中常用的快捷键操作
- 通过JDBC操作数据库的标准示例
- Web安全之文件操作