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