首页 > 试题广场 >

用C语言实现一个公用库函数void * memmove(vo

[问答题]

C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n)。该函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。注意,作为公用库函数,请注意安全检查,注意处理内存区重合的情况。

推荐


 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);
   }


编辑于 2015-02-04 18:02:54 回复(0)
使用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;
}
发表于 2015-01-27 19:28:20 回复(0)
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;
}

发表于 2019-07-30 21:06:12 回复(0)