movimiento de memoria() en C/C++

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;
}
Producción

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;
}
Producción

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;
}
Producción

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *