Skip to content

memmove

Marcos edited this page Oct 1, 2024 · 1 revision

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.

Explicación del comando man

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.

Explicación con mis palabras

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.

Implementación en C

Aquí te muestro mi implementación de la función ft_memmove en mi proyecto de Libft.

Código de ft_memmove

#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);
}

Main para probar ft_memmove

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;
}

Recomendaciones o ejemplos de uso

  • ¿Por qué usar memmove?
    memmove es 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 de memcpy, que no garantiza un comportamiento seguro en caso de solapamiento, memmove asegura que la copia se realice correctamente.

  • ¿Cuándo usar memmove?
    Usa memmove cuando 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 usar memcpy, que es más eficiente en esos casos.

Clone this wiki locally