๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿฐ42์„œ์šธ/libft

[libft] ft_memcpy, ft_memmove ๊ตฌํ˜„

๐Ÿ“Œmemcpy

โœ”๏ธ ํ•จ์ˆ˜ ํ”„๋กœํ† ํƒ€์ž…

void	*memcpy(void *restrict dst, const void *restrict src, size_t n);

โœ”๏ธ ํ•จ์ˆ˜์˜ ์—ญํ•  : ๋ฉ”๋ชจ๋ฆฌ์˜์—ญ src๋กœ๋ถ€ํ„ฐ n ๋ฐ”์ดํŠธ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ dst์— ๋ณต์‚ฌํ•œ๋‹ค.

โœ”๏ธํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’ 

โœ๏ธ dst

๐Ÿ‘€์ถ”๊ฐ€ ์„ค๋ช… ๐Ÿ‘€

โžฟ dst์™€ src์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๊ฒน์ณ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” undefined behavior์ด๋‹ค. (๊ฒน์ณ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” memmove()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.)

โœ”๏ธ๊ตฌํ˜„

#include "libft.h"

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

	i = 0;
	if (dst == 0 && src == 0)
		return (NULL);
	if (n == 0)
		return (dst);
	while (i < n)
	{
		*((unsigned char *)dst + i) = *((unsigned char *)src + i);
		i++;
	}
	return (dst);
}

(42์„œ์šธ์˜ libft ๊ณผ์ œ์—์„œ๋Š” c90์„ ์ด์šฉํ•ด ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— restrict๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.)

๐Ÿ“Œmemmove

โœ”๏ธ ํ•จ์ˆ˜ ํ”„๋กœํ† ํƒ€์ž…

 void	*memmove(void *dst, const void *src, size_t len);

โœ”๏ธ ํ•จ์ˆ˜์˜ ์—ญํ•  : src์˜ len ๋ฐ”์ดํŠธ๋ฅผ dst์— ๋ณต์‚ฌํ•œ๋‹ค. src์™€ dst๋Š” ๊ฒน์ณ์งˆ ์ˆ˜ ์žˆ๋‹ค; ๋ณต์‚ฌ๋Š” ํ•ญ์ƒ ํ›ผ์†ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

โœ”๏ธํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’ 

โœ๏ธ dst

 

๐Ÿ‘€์ถ”๊ฐ€ ์„ค๋ช… ๐Ÿ‘€

โžฟ ๊ตฌํ˜„ ์‹œ dst์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ src๋ณด๋‹ค ์•ž์— ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ๋’ค์— ์žˆ๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌํ˜„ํ•œ๋‹ค.

โžฟ dst < src ์ธ ๊ฒฝ์šฐ, ์•ž์—์„œ๋ถ€ํ„ฐ ๋ณต์‚ฌ

โžฟ dst > src ์ธ ๊ฒฝ์šฐ, ๋‘ ๋ฌธ์ž์—ด์ด ๊ฒน์ณ์ ธ์žˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์›๋ณธ์„ ํ›ผ์†์‹œํ‚ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ณต์‚ฌํ•œ๋‹ค.

โžฟ dst == src์ธ ๊ฒฝ์šฐ , dst๋ฅผ ๋ฆฌํ„ด

โœ”๏ธ๊ตฌํ˜„

#include "libft.h"

void	*ft_memmove(void *dst, const void *src, size_t len)
{
	int				i;
	unsigned char	*dst2;
	unsigned char	*src2;

	dst2 = (unsigned char *)dst;
	src2 = (unsigned char *)src;
	if (dst == src || len == 0)
		return (dst);
	if (dst < src)
	{
		i = -1;
		while (++i < (int)len)
			dst2[i] = src2[i];
	}
	else
	{
		i = (int)len;
		while (i--)
			dst2[i] = src2[i];
	}
	return (dst);
}