J'essaie de comprendre la différence entre memcpy()
et memmove()
, et j'ai lu le texte qui memcpy()
ne prend pas en compte la source et la destination qui se chevauchent alors que le memmove()
fait.
Cependant, lorsque j'exécute ces deux fonctions sur des blocs de mémoire qui se chevauchent, elles donnent toutes deux le même résultat. Par exemple, prenez l'exemple MSDN suivant sur la memmove()
page d'aide: -
Existe-t-il un meilleur exemple pour comprendre les inconvénients memcpy
et comment les memmove
résoudre?
// 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 );
}
Production:
The string: aabbcc
New string: aaaabb
The string: aabbcc
New string: aaaabb
memcpy
- fort voudrait assert
que les régions ne se chevauchent pas plutôt que de masquer intentionnellement les bogues dans votre code.
The string: aabbcc New string: aaaaaa The string: aabbcc New string: aaaabb