memcpy和memmove() 实现和区别
来源:互联网 发布:2016流行语言网络语言 编辑:程序博客网 时间:2024/05/16 01:29
void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。
二者的c语言实现很简单,有兴趣的朋友可以去看看。在实际情况下,这两个函数都是用汇编实现的。
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()的结果就不一定正确了
函数的实现(自己先试试);
void *mymemmove(void *dest, const void *src, size_t count)
{
assert(dest != NULL || src != NULL)
if (dst < src||pdest>psrc+n) //内存没有重合或重合(dest<src&&dest+n>src)
{
char *p = (char *)dest;
char *q = (char *)src;
while (count--)
{
*p++ = *q++;
}
}
else
{
char *p = (char *)dest + count;
char *q = (char *)src + count;
while (count--)
{
*--p = *--q; ////dest>src&&dest<src+n的情况,两段内存空间有重合,从后往前copy。
}
}
return dest;
}
void *mymemcpy(void *dest, const void *src, size_t count)
{
assert(dest != NULL || src != NULL);
char *tmp = (char *)dest;
char *p = (char *)src;
while (count--)
{
*tmp++ = *p++;
}
return dest;
}
- memcpy和memmove() 实现和区别
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy memmove区别和实现
- memcpy和memmove区别和实现
- memcpy和memmove 区别
- memmove和memcpy区别
- memcpy() 和memmove()区别
- memcpy和memmove区别
- 得到数组最后一个数
- The 7th Zhejiang Provincial Collegiate Programming Contest->Problem B:B - Somali Pirates
- php的str_replace函数
- C++数据结构 简单栈 (一贯作风::懒)
- ffmpeg .avi视频转码
- memcpy和memmove() 实现和区别
- thinkphp使用js实现点击加载更多后, 底部无刷新加载出新的数据并显示在该页
- LICECAP Gif屏幕录制软件
- The 7th Zhejiang Provincial Collegiate Programming Contest->Problem G:G - Wu Xing
- AMD&CommonJS入门学习
- leetcode:Kth Smallest Element in a B
- Android--Dialog对话框
- 得不到数据库中的数据
- I/O复用的高级应用三:同时处理TCP和UDP服务