memcpy和memmove的区别
2016-05-07 11:54
369 查看
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,函数原型如下:
void *my_memcpy(void *dest, const void *src,size_t count)
void *my_memmove(void *dest, const void * src, size_t count)
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。
memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比
memmove的速度要快一些,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)与memmove(p2, p1, 5)的结果就可能是不同的,memmove()可以将p1的头5个字符"12345"正确拷贝至p2,而memcpy()的结果就不一定正确了。
关于memmove的实现:
void *my_memmove(void *dest, const void * src, size_t count)
{
char *pDest = (char *)dest;
char *pSrc = (char *)src;
assert(dest);
assert(src);
if ((pDest >= pSrc) && (pDest <= pSrc + count))
{
while (count--)
{
*(pDest + count) = *(pSrc + count);
}
}
else//不重叠
{
while (count--)
{
*pDest++ = *pSrc++;
}
}
return dest;
}
关于memcpy的实现:
void *my_memcpy(void *dest, const void *src,size_t count)
{
assert(dest);
assert(src);
char *pDest = (char*)dest;
char *pSrc = (char*)src;
if ((pDest >= pSrc) && (pDest <= pSrc + count))
{
while (count--)
{
*(pDest + count) = *(pSrc + count);
}
}
else
{
while (count--)
{
*pDest++ = *pSrc++;
}
}
return dest;
}
void *my_memcpy(void *dest, const void *src,size_t count)
void *my_memmove(void *dest, const void * src, size_t count)
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。
memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比
memmove的速度要快一些,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)与memmove(p2, p1, 5)的结果就可能是不同的,memmove()可以将p1的头5个字符"12345"正确拷贝至p2,而memcpy()的结果就不一定正确了。
关于memmove的实现:
void *my_memmove(void *dest, const void * src, size_t count)
{
char *pDest = (char *)dest;
char *pSrc = (char *)src;
assert(dest);
assert(src);
if ((pDest >= pSrc) && (pDest <= pSrc + count))
{
while (count--)
{
*(pDest + count) = *(pSrc + count);
}
}
else//不重叠
{
while (count--)
{
*pDest++ = *pSrc++;
}
}
return dest;
}
关于memcpy的实现:
void *my_memcpy(void *dest, const void *src,size_t count)
{
assert(dest);
assert(src);
char *pDest = (char*)dest;
char *pSrc = (char*)src;
if ((pDest >= pSrc) && (pDest <= pSrc + count))
{
while (count--)
{
*(pDest + count) = *(pSrc + count);
}
}
else
{
while (count--)
{
*pDest++ = *pSrc++;
}
}
return dest;
}
相关文章推荐
- 字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较
- 基于C++执行内存memcpy效率测试的分析
- C++中memcpy和memmove的区别总结
- 【经典】关于C语言内存移动函数的写法详解
- C--memcpy
- memcpy 拷贝函数
- JAVA中类似C中memcpy功能
- 浅析在类模版中构建成员函数时,使用memcpy产生的副作用
- 学习笔记---mem族函数
- strcpy和memcpy的区别与实现
- memmove函数如何考虑内存重叠的
- memset与memcpy
- C++学习小记(memcpy、memmove、memccpy以及memset)
- 最近碰到的一个关于memcpy的奇葩问题
- strcpy()和memcpy()函数中忽略的内存覆盖问题
- 关于不同类型之间使用memcpy
- memcpy函数的使用
- 删除字符串中所有给定的子串
- 用C语言模拟实现memcpy函数,memmove函数和memset函数
- 有关字符串中的函数及其部分面试题