memcpy和memmove的区别

实现代码:

void *memcpy(void *s1, const void *s2, size_t n)

{                        /* copy char s2[n] to s1[n] in any order*/

    char *su1;

    const char *su2;

    

    for(su1 = s1, su2 = s2; 0<n; ++su1, ++su2, --n)

        *su1 = *su2;

    return s1;

}



void *memmove(void *s1, const void *s2, size_t n)

{                        /*copy char s2[n] to s1[n] safely*/

    char *sc1;

    const char *sc2;



    sc1 = s1;

    sc2 = s2;

    if(sc2 <sc1 && sc1 < sc2 + n)

        for(sc1 += n, sc2 += n; 0 < n; --n)    /*copy backwards*/

            *--sc1 = *--sc2;

    else

        for(; 0 < n; --n)    /*copy forwards*/

            *sc1++ = *sc2++;

    return s1;

}

 其中字符串的重叠情形可以根据下图来理解:

测试代码

#include <string.h>

#include <stdio.h>

int main(int argc, char **argv)

{

    char a[]="12abcdef";

    char b[]="12abcdef";

    memcpy(a+2,a,5);

    puts(a);

    memmove(b+2,b,5);

    puts(b);

}

但是在windows 7 VS2008环境下,直接使用string.h进行测试,得到的结果竟然是一样的:

output1

于是直接将二者的实现代码copy过来,得到的结果果然不一样。。

output

初步估计是windows下memcpy实现机制不同。

你可能感兴趣的:(move)