memcpy未处理内存重叠情况,实现源码如下:
// undeal with overlapping
void* memcpy(void* dst, void* src, size_t n)
{
assert(NULL !=src && NULL !=dst && n > 0);
char *src_ptr = (char *)src;
char *dst_ptr = (char *)dst;
for (size_t i = 0; i < n; i++) {
*dst_ptr++ = *src_ptr++;
}
return dst;
}
memmove处理了内存重叠的情况,dst大于src时,从后往前拷贝,dst小于src时从前往后拷贝:
void* memmove(void* dst, void* src, size_t n)
{
assert(NULL !=src && NULL !=dst && n > 0);
char *src_ptr = (char *)src;
char *dst_ptr = (char *)dst;
if ((dst_ptr >= src_ptr + n) || (dst_ptr <= src_ptr)) {
for (size_t i = 0; i < n; i++) {
*dst_ptr++ = *src_ptr++;
}
} else {
char *dst_tmp_ptr = dst_ptr + n - 1;
char *src_tmp_ptr = src_ptr + n - 1;
for (size_t i = 0; i < n; i++) {
*--dst_tmp_ptr = *--src_tmp_ptr;
}
}
return dst;
}
在实际使用中,如果不确定dst和src是否有重叠,使用memmove,如果确定没有重叠,使用memcpy。