Próbuję zrozumieć różnicę między memcpy()
i memmove()
, i przeczytałem tekst, memcpy()
który nie uwzględnia nakładającego się źródła i miejsca docelowego, podczas gdy memmove()
tak.
Jednak gdy wykonuję te dwie funkcje na nakładających się blokach pamięci, obie dają ten sam wynik. Na przykład weź następujący przykład MSDN na stronie memmove()
pomocy: -
Czy istnieje lepszy przykład, aby zrozumieć wady memcpy
i jak memmove
je rozwiązać?
// 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 );
}
Wynik:
The string: aabbcc
New string: aaaabb
The string: aabbcc
New string: aaaabb
memcpy
byłoby assert
, gdyby regiony nie zachodziły na siebie, a nie celowo ukrywały błędy w kodzie.
The string: aabbcc New string: aaaaaa The string: aabbcc New string: aaaabb