ft_memmove.c
Esta función permite copiar una cantidad de bytes de la cadena de orígen a la de destino. En este caso no se contempla el problema de superposición, ya que lo veremos en el próximo ejercicio.
Enunciado
memmove(3)
NOMBRE
memcpy --> copia una cadena
CABECERA
void *memmove(void *dst, const void *src, size_t n);
DESCRIPCIÓN
Copia `n` bytes de la cadena de orígen `src` hacia la de destino `dst`. En caso de que se droduzca una superposición de datos, preserva la integridad de estos, copiandolos de una forma no destructiva.
DEVOLUCIÓN
Devuelve el valor original de `dst`.Superposición de memória
Tal y como puedes ver en esta explicación de "Medium", se produce un overlap de memória en cuanto al copiar byte por byte una cadena, resulta que cuando llegamos a un punto donde al intentar copiar un valor, vemos que ese ya ha sido modificado con uno de los valores que hemos copiado anteriormente.
Supongamos que disponemos de una cadena de 5 chars, donde cada uno equivale a un byte de longitud:
+++++++++++++++++++++++++++++++ | 'a' | 'b' | 'c' | 'd' | 'e' | +++++++++++++++++++++++++++++++ 0x100 0x101 0x102 0x103 0x104Ahora, recordando el planteamiento del manual acerca de
memcpy, tomamos 3 argumentos, un puntero al bloque de memória de origen y el tamaño de los bytes que queremos copiar de un lado al otro.¿Qué pasaría si el destino fuera
0x102, el orígen0x100y el tamaño, fuera3? En este caso, ocurre la superposición de memórias. Es decir que,0x100sería copiado sobre0x102,0x101sería copiado sobre0x103y0x102lo sería sobre0x104.Date cuenta que primero copiamos
0x102. Cuando siguiendo la cadena, procedemos a copiar0x102, su valor se ha perdido ya que lo hemos sobreescrito a medida que copiabamos los valores. Por tanto, terminaremos con algo parecido a esto:+++++++++++++++++++++++++++++++ | 'a' | 'b' | 'a' | 'b' | 'a' | +++++++++++++++++++++++++++++++ 0x100 0x101 0x102 0x103 0x104En lugar de:
+++++++++++++++++++++++++++++++ | 'a' | 'b' | 'a' | 'b' | 'c' | +++++++++++++++++++++++++++++++ 0x100 0x101 0x102 0x103 0x104Entonces, ¿Cómo se ocupa la función
memmovede evitar la superposición?De acuerdo a la página original del manual, primero copiaremos los valores en una matriz temporal y luego los pegaremos en un bloque distinto al que estaban en inicio, a diferencia de
memcpyque pega el contenido sobre el mismo bloque donde se ubicab anteriormente
Planteamiento
Solución
Última actualización
¿Te fue útil?