ft_memcpy / ft_memmove

hni1124·2022년 1월 24일
0

memcpy 함수 원형

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

용도 : src를 dst로 복사. 원본 주소 손상없어야 함.

리턴 : dst의 주소.

이슈 : dst > src일 경우.
src내의 손상이 발생가능할 수 있음 >>> 제대로 된 복사가 힘듦
해당 이슈를 해결하는 함수가 memmove (위의 경우에 뒤에서부터 복사함)

코드

#include "libft.h"

void	*ft_memcpy(void *dst, const void *src, size_t size)
{
	unsigned char	*c;
	unsigned char	*sc;
	size_t			i;

	i = 0;
	c = dst;
	sc = (unsigned char *)src;
	if (c == sc)
		return (c);
	while (i < size)
	{
		c[i] = sc[i];
		i++;
	}
	return (dst);
}

memmove 함수원형

void *memmove(void dst, const void src, size_t num)

memcpy와 용도는 동일

dst < src일 경우 : 그냥 순서대로 복사
dst >= src일 경우 : 뒤에서부터 복사

코드

#include "libft.h"

void	ft_makeds1(unsigned char *dst, unsigned char *src, size_t num)
{
	size_t	i;

	i = 0;
	while (i < num)
	{
		dst[i] = src[i];
		i++;
	}
}

void	ft_makeds2(unsigned char *dst, unsigned char *src, size_t num)
{
	size_t	i;

	i = (num - 1);
	while (i >= 0)
	{
		dst[i] = src[i];
		if (i == 0)
			break ;
		i--;
	}
}

void	*ft_memmove(void *dst, const void *src, size_t num)
{
	unsigned char	*ds;
	unsigned char	*sc;

	ds = (unsigned char *)dst;
	sc = (unsigned char *)src;
	if (dst == src || num == 0)
		return (dst);
	if (dst < src)
		ft_makeds1(ds, sc, num);
	else
		ft_makeds2(ds, sc, num);
	return (dst);
}

ft_memcpy // ft_memmove 요약

둘다 복사는 하나 cpy의 이슈를 move가 해결.

안정성 : move
속도 : cpy

profile
42Seoul / 알고리즘 공부 중

0개의 댓글