memcpy的实现

chenyu2202863 2008-03-24 12:15:37
通常来说,这个函数的实现比较简单

我看了下crt的实现源码,如下:(略去64位机的)
void * __cdecl memcpy (
void * dst,
const void * src,
size_t count
)
{
void * ret = dst;

while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}

return(ret);
}


今天,我看到一个面试题上叫实现这个函数,看了下它的参考答案,如下
void *MyMemCopy(void *dest,const void *src,size_t count)
{
char *pDest=static_cast<char *>(dest);
const char *pSrc=static_cast<const char *>(src);

//注意,这里是关键,为什么要这样比较呢?理由何在?
if( pDest>pSrc && pDest<pSrc+count )
{
for(size_t i=count-1; i<=0; ++i)
{
pDest[i]=pSrc[i];
}
}
else
{
for(size_t i=0; i<count; ++i)
{
pDest[i]=pSrc[i];
}
}

return pDest;
}


大家讨论下吧~
...全文
10901 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
laigo 2012-10-29
  • 打赏
  • 举报
回复


if( pDest>pSrc && pDest<pSrc+count )
{
for(size_t i=count; i>0; --i)
{
*(pDest+i-1) = *(pSrc+i-1);
}

}



[Quote=引用 15 楼 的回复:]
C/C++ code
for(size_t i=count-1; i<=0; ++i)//应该是for(size_t i = count-1;i>=0;--i)吧
{
pDest[i]=pSrc[i];
}
[/Quote]
lht1936 2011-07-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 shp19900510 的回复:]

如果是source在dest前面
| des |
| src |
这样,可以
else
{
for(size_t i=0; i<count; ++i)
{
pDest[i]=pSrc[i];
}
}
这样实现吗?而且函数src已经是const了,怎样完成复制?……
[/Quote]pDest不是const,可以通过它修改内存
shp19900510 2011-05-01
  • 打赏
  • 举报
回复
如果是source在dest前面
| des |
| src |
这样,可以
else
{
for(size_t i=0; i<count; ++i)
{
pDest[i]=pSrc[i];
}
}
这样实现吗?而且函数src已经是const了,怎样完成复制?
qwer_boo 2011-04-24
  • 打赏
  • 举报
回复
学习了
is_leon 2010-11-26
  • 打赏
  • 举报
回复
for(size_t i=count-1; i<=0; ++i)//应该是for(size_t i = count-1;i>=0;--i)吧
{
pDest[i]=pSrc[i];
}

linux_id 2010-09-14
  • 打赏
  • 举报
回复
2楼你的第2段代码返回值不是悬垂指针吗??
linux_id 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 chenyu2202863 的回复:]
通常来说,这个函数的实现比较简单

我看了下crt的实现源码,如下:(略去64位机的)

C/C++ code
void * __cdecl memcpy (
void * dst,
const void * src,
size_t count
)
{
void * ret = dst;

……
[/Quote]
楼主,第2断代码的返回值可以是局部的指针吗??
我怎么觉着不对啊??
Trust_haitao365 2009-06-05
  • 打赏
  • 举报
回复
学习了,昨天我面试也遇到了这个问题。
sheenl 2008-03-24
  • 打赏
  • 举报
回复
天哪, 这种"内存重叠"你也有办法判断出来?
chenyu2202863 2008-03-24
  • 打赏
  • 举报
回复
看了大家的回复,查了下资料,
发现问题在这里:

当我们malloc或者new的时候,我们是在虚拟内存上分配的空间,当我们使用这些空间的时候,虚拟内存要映射到物理内存
又因为内存映射是多对一的,所以就有可能出现内存重叠,此时,我们就应该判断

不知道我的认识是否到位?
野男孩 2008-03-24
  • 打赏
  • 举报
回复
memcpy跟memmove的区别,memmove可以处理重叠的情况
laolaoliu2002 2008-03-24
  • 打赏
  • 举报
回复
memcpy是把source 指向的对象中的n个字符拷贝到destin所指向的对象中,返回指向结果对象的指针。
laolaoliu2002 2008-03-24
  • 打赏
  • 举报
回复
http://www.chinaitpower.com/A/2001-10-17/2036.html
我啃 2008-03-24
  • 打赏
  • 举报
回复
overleap

google memcpy memmove
Treazy 2008-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Treazy 的回复:]
这个就是memcpy与memmove的区别

数据重叠区的处理!

楼主试试上面2个函数处理重叠数据区的copy

看了结果就知道为什么了!
[/Quote]

我说的是c标准库的这2个函数!
星羽 2008-03-24
  • 打赏
  • 举报
回复
ctr的memset是不管区域重叠的,使用memmov则考虑区域重叠,更安全写
Treazy 2008-03-24
  • 打赏
  • 举报
回复
这个就是memcpy与memmove的区别

数据重叠区的处理!

楼主试试上面2个函数处理重叠数据区的copy

看了结果就知道为什么了!
星羽 2008-03-24
  • 打赏
  • 举报
回复
解决区域重叠问题

比如这种

| src |
| dst |
paidfighting 2008-03-24
  • 打赏
  • 举报
回复
代码都已经说的很明白了吧。。。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧