区别:

memmove 重叠时能保证 dst 数据正常,但 memcpy 就不会保证了。


#include <string.h>
#include <stdio.h>

int main()
{
    // case 1: not overlap
    
	char str[6] = "12345";
    memmove(str + 2, str, 2);
    printf("memmove: %s\n", str);   // 12125 - ok
    
    char str2[6] = "12345";
    memcpy(str2 + 2, str2, 2);
    printf("memmove: %s\n", str2);  // 12125 - ok
    
    // case 2: overlap
    
    char str3[6] = "12345";
    memmove(str3 + 2, str3, 3);     // the 3rd byte overlap
    printf("memmove: %s\n", str3);  // 12123 - ok
    
    char str4[6] = "12345";
    memcpy(str4 + 2, str4, 3);
    printf("memmove: %s\n", str4);  // 12121 - wrong
	
	return 0;
}