Saya mencoba memahami perbedaan antara memcpy()
dan memmove()
, dan saya telah membaca teks yang memcpy()
tidak menangani sumber dan tujuan yang tumpang tindih sedangkan yang memmove()
tidak.
Namun, ketika saya menjalankan kedua fungsi ini pada blok memori yang tumpang tindih, keduanya memberikan hasil yang sama. Misalnya, ambil contoh MSDN berikut di memmove()
halaman bantuan: -
Apakah ada contoh yang lebih baik untuk memahami kelemahan memcpy
dan bagaimana memmove
menyelesaikannya?
// 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 );
}
Keluaran:
The string: aabbcc
New string: aaaabb
The string: aabbcc
New string: aaaabb
memcpy
akan assert
bahwa daerah tidak tumpang tindih bukan sengaja menutupi bug dalam kode Anda.
The string: aabbcc New string: aaaaaa The string: aabbcc New string: aaaabb