Estoy tratando de entender la diferencia entre memcpy()
y memmove()
, y he leído el texto que memcpy()
no se ocupa de la fuente y el destino superpuestos, pero memmove()
sí lo hace.
Sin embargo, cuando ejecuto estas dos funciones en bloques de memoria superpuestos, ambos dan el mismo resultado. Por ejemplo, tome el siguiente ejemplo de MSDN en la memmove()
página de ayuda:
¿Hay un mejor ejemplo para comprender los inconvenientes memcpy
y cómo lo memmove
resuelve?
// crt_memcpy.c
// Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle
// it correctly.
#include <memory.h>
#include <string.h>
#include <stdio.h>
char str1[7] = "aabbcc";
int main( void )
{
printf( "The string: %s\n", str1 );
memcpy( str1 + 2, str1, 4 );
printf( "New string: %s\n", str1 );
strcpy_s( str1, sizeof(str1), "aabbcc" ); // reset string
printf( "The string: %s\n", str1 );
memmove( str1 + 2, str1, 4 );
printf( "New string: %s\n", str1 );
}
Salida:
The string: aabbcc
New string: aaaabb
The string: aabbcc
New string: aaaabb
memcpy
haría assert
que las regiones no se superponen en lugar de cubrir intencionalmente errores en el código.
The string: aabbcc New string: aaaaaa The string: aabbcc New string: aaaabb