void * memcpy(void *dest, const void *src, size_t count)
{
assert(dest != NULL || src != NULL);
char *tmp = (char *)dest;
const char *p = (const char *)src;
while (count--)
{
*tmp++ = *p++;
}
return dest;
}
i、n、k的内存和J、e、l的内存地址重合了,现在再使用上面的代码进行copy时,会出现什么问题呢?你有没有想过这个问题。如果没有,那就现在想想,不急着阅读下面的内容。
再说memmove
memmove也是用来实现内存的直接拷贝的。说起这个命名,我个人觉的多少还是有点坑的。既然memmove也是用来内存数据移动的,那就先来看看memmove的实现源码。
void * memmove(void *dest, const void *src, size_t num)
{
assert(dest != NULL || src != NULL);
if (dest < src)
{
memcpy(dest, src, num);
}
else
{
char *p = (char *)dest + num;
const char *q = (const char *)src + num;
while (num--)
{
*--p = *--q;
}
}
return dest;
}
从源码看,memmove的确比memcpy复杂一些;再仔细一看,多了些什么?哦,多了一个else分支,而正是这个else分支,就处理了当src和dest的内存重合的问题。
memcpy和memmove的比较
从实现源码中的确能看出一些猫腻,当出现了src和dest的内存有重合的时机时,memmove的处理规则是从后往前进行copy。当然了,重合的问题,需要考虑的以下两种场合。
如图所示,当出现(1)对应的情况时,就需要先从src的头部开始复制;也就是memmove源码中的if分支,这部分源码和memcpy的实现是一致的;当出现(2)对应的情况时,就需要先从src的尾部开始复制,防止出现了覆盖现象。这就是memmove比memcpy多的一个考虑点,所以说,在实际使用时,使用memmove是比memcpy更安全的。
原文链接: http://www.jb51.net/article/56012.htm
本文详细解析了C++中memcpy和memmove函数的区别,重点介绍了它们在内存拷贝过程中的不同处理方式,尤其是memmove如何解决内存重叠问题。
5694

被折叠的 条评论
为什么被折叠?



