Ich versuche, den Unterschied zwischen memcpy()
und zu verstehen memmove()
, und ich habe den Text gelesen, der memcpy()
sich nicht um die überlappende Quelle und das überlappende Ziel memmove()
kümmert.
Wenn ich diese beiden Funktionen jedoch auf überlappenden Speicherblöcken ausführe, ergeben beide das gleiche Ergebnis. Nehmen Sie zum Beispiel das folgende MSDN-Beispiel auf der memmove()
Hilfeseite: -
Gibt es ein besseres Beispiel, um die Nachteile zu verstehen memcpy
und wie es memmove
gelöst werden kann?
// 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 );
}
Ausgabe:
The string: aabbcc
New string: aaaabb
The string: aabbcc
New string: aaaabb
memcpy
wäre, assert
dass sich die Regionen nicht überlappen, anstatt absichtlich Fehler in Ihrem Code zu vertuschen.
The string: aabbcc New string: aaaaaa The string: aabbcc New string: aaaabb