memcpy的内存重叠问题
2016-12-27 00:00
375 查看
【注】改编自memmove 和 memcpy的区别。原作者如有不爽,请告知!
memcpy是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:
使用memcpy时,有可能会遇到内存重叠的问题:
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
通过memmove可以避免这一问题。memmove和memcpy实现一样的功能:内存拷贝。原型如下:
以下几点你需要了解:
memove可以避免内存拷贝时的重叠问题。
实际上,memcpy只是memmove的一个子集。
memcpy比memmove的速度要快一些。
有兴趣的,可以看看linux的源码,实现很简单,一看就明白。
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; }
相关文章推荐
- memmove 和 memcpy的区别以及处理内存重叠问题
- memcpy memmove区别和实现(如何处理内存重叠问题)
- memmove 和 memcpy的区别以及处理内存重叠问题
- C\C++内存重叠问题,memcpy,memmov,strcpy
- 实例介绍利用valgrind定位memcpy内存重叠问题------顺便再次说说memcpy和memmove的区别
- memcpy 内存重叠问题
- memmove 和 memcpy的区别以及处理内存重叠问题
- memmove 和 memcpy的区别以及处理内存重叠问题
- C内存重叠问题,memcpy,memmov,strcpy
- memcpy内存重叠问题
- C内存重叠问题,memcpy,memmov,strcpy
- memmove 和 memcpy的区别以及处理内存重叠问题
- memmove 和 memcpy的区别以及处理内存重叠问题
- memcpy内存重叠的解决
- strcpy,memcpy,memmove的内存重叠
- c语言内存管理函数,模拟memcpy、memmove(实现内存重叠拷贝)、memset
- C++中内存重叠问题如何解决?
- C++中的内存重叠问题
- 内存重叠问题分析与解决方案
- strcpy,memcpy,memmove和内存重叠分析