Tôi đang cố gắng để hiểu sự khác biệt giữa memcpy()
và memmove()
, và tôi đã đọc văn bản memcpy()
không quan tâm đến nguồn và đích chồng chéo trong khi memmove()
đó.
Tuy nhiên, khi tôi thực hiện hai chức năng này trên các khối bộ nhớ chồng chéo, cả hai đều cho kết quả như nhau. Ví dụ: lấy ví dụ MSDN sau trên memmove()
trang trợ giúp: -
Có một ví dụ tốt hơn để hiểu những nhược điểm của memcpy
và làm thế nào để memmove
giải quyết nó?
// 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 );
}
Đầu ra:
The string: aabbcc
New string: aaaabb
The string: aabbcc
New string: aaaabb
memcpy
sẽ assert
là khu vực không chồng chéo lên nhau chứ không phải là cố tình bao che cho lỗi trong mã của bạn.
The string: aabbcc New string: aaaaaa The string: aabbcc New string: aaaabb