memmove() se usa para copiar un bloque de memoria de una ubicación a otra. Se declara en string.h
// Copies "numBytes" bytes from address "from" to address "to" void * memmove(void *to, const void *from, size_t numBytes);
A continuación se muestra un programa en C de muestra para mostrar el funcionamiento de memmove().
C
/* A C program to demonstrate working of memmove */ #include <stdio.h> #include <string.h> int main() { char str1[] = "Geeks"; // Array of size 100 char str2[] = "Quiz"; // Array of size 5 puts("str1 before memmove "); puts(str1); /* Copies contents of str2 to sr1 */ memmove(str1, str2, sizeof(str2)); puts("\nstr1 after memmove "); puts(str1); return 0; }
str1 before memmove Geeks str1 after memmove Quiz
¿En qué se diferencia de memcpy() ?
memcpy() simplemente copia los datos uno por uno de una ubicación a otra. Por otro lado, memmove() copia los datos primero a un búfer intermedio, luego desde el búfer al destino.
memcpy() genera problemas cuando las strings se superponen.
Por ejemplo, considere el siguiente programa.
C
// Sample program to show that memcpy() can lose data. #include <stdio.h> #include <string.h> int main() { char csrc[100] = "Geeksfor"; memcpy(csrc + 5, csrc, strlen(csrc) + 1); printf("%s", csrc); return 0; }
GeeksGeeksfor
Dado que las direcciones de entrada se superponen, el programa anterior sobrescribe la string original y provoca la pérdida de datos.
Considere el siguiente programa para comprender la diferencia entre la función memcpy y memmove en caso de que se produzca una superposición.
C
// Sample program to show that memmove() is better than // memcpy() when addresses overlap. #include <stdio.h> #include <string.h> int main() { char str[100] = "Learningisfun"; char *first, *second; first = str; second = str; printf("Original string :%s\n ", str); // when overlap happens then it just ignore it memcpy(first + 8, first, 10); printf("memcpy overlap : %s\n ", str); // when overlap it start from first position memmove(second + 8, first, 10); printf("memmove overlap : %s\n ", str); return 0; }
Original string :Learningisfun memcpy overlap : LearningLearningis memmove overlap : LearningLearningLe
Como puede ver claramente con la función memmove cada vez que se superpone (es decir, cuando el primer puntero se mueve al carácter ‘i’), el primer puntero comenzará a imprimirse desde el principio (salida Le) pero con la función memcpy, simplemente ignora si hay es una superposición y simplemente seguir avanzando.
¿Escribe tu propio memcpy() y memmove()?
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA