-
Notifications
You must be signed in to change notification settings - Fork 0
memmove
La función ft_memmove copia len bytes desde el área de memoria apuntada por src al área de memoria apuntada por dst. A diferencia de memcpy, ft_memmove está diseñada para manejar correctamente el caso en que las áreas de memoria se solapan.
MEMMOVE(3) (simplified)
NAME
memmove -- copy byte string
SYNOPSIS
void *memmove(void *dst, const void *src, size_t len);
DESCRIPTION
The memmove() function copies len bytes from string src to string dst.
The two strings may overlap; the copy is always done in a non-destructive manner.
RETURN VALUES
The memmove() function returns the original value of dst.
La función memmove() copia len bytes desde el área de memoria src a la memoria dst. La principal diferencia con memcpy() es que memmove() maneja el solapamiento de las áreas de memoria de manera segura. Si las áreas se solapan, copia primero los bytes a una ubicación temporal para evitar la corrupción de datos.
Aquí te muestro mi implementación de la función ft_memmove en mi proyecto de Libft.
#include "libft.h"
void *ft_memmove(void *dst, const void *src, size_t len)
{
char *tmp_dst;
char *tmp_src;
size_t i;
// Si ambos punteros son NULL, devolvemos NULL
if (!dst && !src)
return (NULL);
// Convertimos los punteros a char* para manipular byte a byte
tmp_dst = (char *)dst;
tmp_src = (char *)src;
i = 0;
// Si la dirección de destino está después de la de origen, copiamos de atrás hacia adelante
if (tmp_dst > tmp_src)
while (len-- > 0)
tmp_dst[len] = tmp_src[len];
else
{
// Si no hay riesgo de solapamiento, copiamos de adelante hacia atrás
while (i < len)
{
tmp_dst[i] = tmp_src[i];
i++;
}
}
return (dst);
}El siguiente código es un ejemplo de cómo puedes probar la función ft_memmove():
#include <stdio.h>
void *ft_memmove(void *dst, const void *src, size_t len);
int main(void)
{
char str[] = "HelloWorld";
// Ejemplo con solapamiento: copiamos parte de la cadena dentro de la misma memoria
ft_memmove(str + 2, str, 5); // Copiamos "Hello" a la posición +2
printf("Resultado después de memmove con solapamiento: %s\n", str); // Output: "HeHellold"
return 0;
}-
¿Por qué usar
memmove?
memmovees ideal cuando necesitas copiar memoria de un bloque a otro y existe la posibilidad de que las áreas de origen y destino se solapen. A diferencia dememcpy, que no garantiza un comportamiento seguro en caso de solapamiento,memmoveasegura que la copia se realice correctamente. -
¿Cuándo usar
memmove?
Usamemmovecuando sospeches que las áreas de memoria podrían solaparse. Es útil, por ejemplo, cuando estás moviendo partes de un array en la misma dirección o copiando datos dentro de un buffer que se sobreponen parcialmente. -
Alternativa:
Si sabes con certeza que no habrá solapamiento entre las áreas de memoria, puedes usarmemcpy, que es más eficiente en esos casos.