Cả 2 hàm memcpy và memmove được sử dụng để copy N byte dữ liệu từ vùng nhớ này sang vùng nhớ khác. Tuy nhiên, trong trường hợp vùng nhớ nguồn overlap với vùng nhớ đích:
- Hàm memmove đảm bảo việc copy dữ liệu và output là chính xác .
- Hàm memcpy KHÔNG đảm bảo việc copy dữ liệu và output là chính xác.
Ví dụ sau sẽ giúp các bạn hiểu thêm về sự khác nhau của 2 hàm trong trường hợp vùng nhớ bị overlap.
#include <stdio.h> #include <string.h> #include <conio.h> char str1[20] = "vncoding.net"; void main( void ) { printf("The string: %s\n", str1); memcpy(str1 + 2, str1, 6); printf("New string: %s\n", str1); strcpy_s(str1, sizeof(str1), "vncoding.net"); // reset string printf("The string: %s\n", str1); memmove(str1 + 2, str1, 6); printf("New string: %s\n", str1); getch(); }
Kết quả:
Theo như kết quả, hàm memmove đảm bảo kết quả đúng như mong muốn (“vncodi” ghi đè lên “coding”).
Hình như ví dụ sai rồi, visual 2016 chạy như nhau.