您的位置:首页 > 其它

memcpy的内存重叠问题

2016-12-27 00:00 375 查看
【注】改编自memmove 和 memcpy的区别。原作者如有不爽,请告知!

memcpy是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:

void *memcpy(void *dest, const void *src, size_t count)

使用memcpy时,有可能会遇到内存重叠的问题:



第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。

通过memmove可以避免这一问题。memmove和memcpy实现一样的功能:内存拷贝。原型如下:

void *memmove(void *dest, const void *src, size_t count)

以下几点你需要了解:

memove可以避免内存拷贝时的重叠问题。

实际上,memcpy只是memmove的一个子集。

memcpy比memmove的速度要快一些。

有兴趣的,可以看看linux的源码,实现很简单,一看就明白。

/**
* memcpy - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* You should not use this function to access IO space, use memcpy_toio()
* or memcpy_fromio() instead.
*/
void *memcpy(void *dest, const void *src, size_t count)
{
char *tmp = dest;
const char *s = src;

while (count--)
*tmp++ = *s++;
return dest;
}

/**
* memmove - Copy one area of memory to another
* @dest: Where to copy to
* @src: Where to copy from
* @count: The size of the area.
*
* Unlike memcpy(), memmove() copes with overlapping areas.
*/
void *memmove(void *dest, const void *src, size_t count)
{
char *tmp;
const char *s;

if (dest <= src) {
tmp = dest;
s = src;
while (count--)
*tmp++ = *s++;
} else {
tmp = dest;
tmp += count;
s = src;
s += count;
while (count--)
*--tmp = *--s;
}
return dest;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息