memcpy,memmove函数实现及区别
2016-08-30 19:57
453 查看
1 功能
memcpy:内存拷贝函数。void*memcpy(void* dest,void* src,size_t n),memcpy函数复制src指向的空间里前n个 字节到dest指向的空间。这里与strcpy不同的是strcpy函数只能拷贝字符串,而memcpy拷贝的是内存里的东 西,包括字符串,整型,结构体等等。memmove:void* memmove(void* dest,void* src size_t n),memove函数的返回类型和参数与memcpy函数一样, 他们的功能也是一样的,都是复制src所指向空间里的前n个字节到dest所指向的空间。唯一的区别是, memcpy函数无法保证当内存重叠时拷贝的结果依然正确,而memmove函数可以做到。
2 区别
如图所示,当使用memcpy进行内存拷贝时,第一种情况可以正常的得到拷贝内容,不存在内存重叠的情况。但是当遇到如下图所示的情况,也就是内存重叠的情况时,就会发生内容丢失的情况。
上图所示的情况当src的前一个字节拷贝到dest时,src所需拷贝的最后一个字节由于和dest内存重叠,所以其内容就变成了src的第一个字节的内容,这就会导致src原本的最后一个字节内容丢失。
这个时候就需要使用memmove函数。
3 代码实现
memcpyvoid* my_memcpy(void* dest,void* src,size_t n) { assert(dest); assert(src); char* pdest = (char*)dest; char* psrc = (char*)src; while ((n--)&&(*pdest++ = *psrc++)) { ; } return dest; }memmove
void* my_memmove(void* dest, void* src, size_t n) { assert(dest); assert(src); char* pdest = (char*)dest; char* psrc = (char*)src; if (src > dest) { while ((n--) && (*pdest++ = *psrc++)) { ; } } else { char* ppdest = pdest + n -1; char* ppsrc = psrc + n -1; while ((n--) && (*ppdest-- = *ppsrc--)) { ; } } return dest; }
4 安全性
在strcpy,strncpy,memcpy和memmove这四个库函数中,安全性是递增的,前三个函数均没有考虑到内存重叠的问题,所以相对来说memmove函数的安全性最高。相关文章推荐
- linux内核中memcpy和memmove函数的区别和实现
- linux内核中memcpy和memmove函数的区别和实现
- linux内核中memcpy和memmove函数的区别和实现
- 模拟实现memcpy、memmove函数以及二者的区别
- Linux内核中memcpy和memmove函数的区别和实现
- memcpy和memmove函数的区别和实现
- linux内核中memcpy和memmove函数的区别和实现
- memcpy与memmove函数的区别
- memmove()与memcpy()的区别与实现
- memmove,memcpy 函数的分别实现
- 几个常用函数的实现strcpy,memcpy,memmove,strcat,strcmp
- memcpy,memmove,strcpy,strcat等系列函数的实现(二)
- memmove、memcpy和mem**y简介及函数的实现
- memcpy、memmove、strcpy函数实现源码及区别
- memcpy和memmove的区别与实现
- 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset
- memcpy和memmove的函数内部实现
- 转载:函数实现-memcpy-strcpy-memmove-memset
- memset ,memcpy ,memmove,strcpy 的根本区别 与实现
- memcpy和memmove函数的实现