memcpy 和 memmove 都是C语言提供的内存拷贝函数。
memcpy的函数实现
linux 实现版本
#include <assert.h> // assert 需要的头文件 void* memcpy(void * dest, void *src, size_t count) { assert(src != NULL && src != NULL); char *tmp = (char *)dest; const char* s = (const char*)src; for (size_t i = 0; i < count; i++) { tmp[i] = s[i]; } return dest; }
<pre name="code" class="cpp">void* memcpy(void * dest, void *src, size_t count) { void *ret = dest; while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; }
该函数有极大缺陷,如内存重复的问题等。
memmove就是一个比较好的选择
void* memmove(void *dest, const void *src, size_t count) { void* ret = dest; if (dest <= src || (char*)dest >= (char*)src + count) { while (count--) { *(char*) dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else { dest = (char*)dest + count - 1; src = (char*)src + count - 1; while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest - 1; src = (char*)src - 1; } } return (ret); }
当src和dest区域没有重叠时,两个函数是完全一样的。木有重叠的条件是: dst <= src || (char *)dst >= ((char *)src + count 。否则,memcpy是不能正常工作的,memmove是可以正常工作的。