memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。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<d) 
    { 
        // start at end of s 
        d = d+n-1; 
        s = s+n-1; 
   
        while (n--) 
           *d-- = *s--; 
    } 
    return dest; 
} 输出是hello呀,也没报错啊!!!
char s[]="hello";
memcpy(s,s,2);
printf("s%\n",s);

解决方案 »

  1.   

    但当源内存和目标内存存在重叠时,memcpy会出现错误//啥错误啊???
      

  2.   

    补上else不就明白了么
    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<d) 
        { 
            // start at end of s 
            d = d+n-1; 
            s = s+n-1; 
        
            while (n--) 
               *d-- = *s--; 
        } 
        else{
        }
        return dest; 

    当s == d 的时候不就没做任何操作了嘛
      

  3.   

    当s=d时,if和else都不满足,等于程序空走一遍,不就相当于什么也不做么?