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