memmove函数的实现

今天百度二面叫我用C语言实现一个memmove函数,我是这样写的:

void *memmove(void *dest, const void *src, size_t n) {
    
   int i;
   char * dest_t = (char *)dest;
   char * src_t = (char *)src;
   
   if ( src_t+n > dest_t && src_t < dest_t) {
       // 从后往前复制
       i = n-1;
       while ( i >= 0) {
           *(dest_t+i) = *(src_t+i);
           i--;
       }
   
   } else {
       // 从前往后复制
       i = 0;
       while (i < n) {
       
           *(dest_t+i) = *(src_t+i);
           i++;
       }
   }
   
   return dest;
}  

虽然有点小bug但功能上还是实现了,在写代码的过程中主要时间都花在了纠结处理内存重叠区了,然后面试官提出了一种更加简单高效的方法来处理内存重叠区,应该也就是memmove函数内部的实现原理:

(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝

(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

void* memmove(void* dest, const void* src, size_t n)
{
    char * d  = (char*) dest;
    const char * s = (const char*) src;
  
    if (s>d)
    {
         // start at beginning of s
         while (n--)
            *d++ = *s++;
    }
    else if (s


你可能感兴趣的:(C语言,Linux)