Skip to content
Marcos edited this page Oct 1, 2024 · 1 revision

La función ft_memcpy copia n bytes del área de memoria apuntada por src al área de memoria apuntada por dst. Las áreas de memoria no deben solaparse, ya que el comportamiento no está definido si lo hacen.

Explicación del comando man

MEMCPY(3) (simplified)

NAME
    memcpy -- copy memory area
SYNOPSIS
    void *memcpy(void *dst, const void *src, size_t n);
DESCRIPTION
    The memcpy() function copies n bytes from memory area src to memory area dst. If dstt and src overlap, behavior is undefined. Applications in which dst and src might overlap should use memove(3) instead.
RETURN VALUES
    The memcpy() function returns the original value of dst

Explicación con mis palabras

La función memcpy() copia exactamente n bytes desde el área de memoria src (origen) al área de memoria dst (destino). Si las áreas de memoria de origen y destino se solapan, el comportamiento es indefinido. Si hay riesgo de solapamiento, es preferible utilizar memmove().

Implementación en C

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

Código de ft_memcpy

#include "libft.h"

void	*ft_memcpy(void *dst, const void *src, size_t n)
{
	unsigned char		*tmp_dst;
	const unsigned char	*tmp_src;

	// Si ambos punteros son NULL, no realizamos ninguna acción
	if (dst == NULL && src == NULL)
		return (dst);

	// Convertimos los punteros para manipular byte por byte
	tmp_dst = (unsigned char *)dst;
	tmp_src = (const unsigned char *)src;

	// Copiamos 'n' bytes desde src a dst
	while (n > 0)
	{
		*(tmp_dst++) = *(tmp_src++);
		n--;
	}

	// Devolvemos el puntero original 'dst'
	return (dst);
}

Main para probar ft_memcpy

El siguiente código es un ejemplo de cómo puedes probar la función ft_memcpy():

#include <stdio.h>

void	*ft_memcpy(void *dst, const void *src, size_t n);

int main(void)
{
	char src[] = "Libft";
	char dst[10];

	ft_memcpy(dst, src, 6); // Copiamos 6 bytes (incluyendo el carácter nulo)
	printf("Destino después de memcpy: %s\n", dst); // Debe aparecer por pantalla "Libft"

	return 0;
}

Recomendaciones o ejemplos de uso

  • ¿Por qué usar memcpy?
    memcpy es eficiente y rápido cuando necesitas copiar bloques de memoria y sabes que no habrá solapamiento entre las áreas de origen y destino. Es adecuado para copiar arrays, estructuras de datos o cualquier tipo de datos binarios entre áreas de memoria.

  • ¿Cuándo usar memcpy?
    Usa memcpy cuando estés seguro de que las áreas de memoria de origen y destino no se solapan. Es útil cuando estás copiando datos entre buffers o estructuras que no se solapan y quieres evitar la sobrecarga de verificación adicional que se hace en funciones como memmove.

  • Alternativas:
    Si las áreas de memoria pueden solaparse, deberías utilizar memmove, ya que maneja correctamente el solapamiento de las áreas de memoria sin pérdida de datos.

Clone this wiki locally