用C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n)。该函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。注意,作为公用库函数,请注意安全检查,注意处理内存区重合的情况。
使用memmove来进行拷贝要考虑区间重叠问题,否则在拷贝过程中可能造成重叠错误。
针对有可能出现的问题给出了一定的处理措施来防止拷贝出错:
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
(3)当源内存的首地址小于目标内存的首地址时,实
行反向拷贝
void *memmove(void *dest,const void *src, size_t n) { if
(NULL == dest || src == NULL) { cerr<<"NULL
pointers!"; return NULL; } int step; char
*p, *q; if ((char *)src == (char *)dest) { return dest;
} else if ((char *)src > (char *)dest) { step = 1; p
= (char *)src; q = (char *)dest; } else { step =
-1; p = (char *)src + n - 1; q = (char *)dest + n - 1;
} for(int i = 0; i != n; ++i) { *q = *p; p +=
step; q += step; } return dest; }