42Seoul/libft

libft - bzero, memcpy, memove

재윤 2023. 3. 24. 10:45
반응형

bezro 

함수원형

void	ft_bzero(void *dest, size_t len);
  1. dest는 저장할 메모리 주소 시작 지점
  2. len은 얼마의 바이트 수 만큼 넣을 것이냐임. 메모리 안에 채워지는 데이터는 0임
#include "libft.h"

void	ft_bzero(void *dest, size_t len)
{
	unsigned char	*temp;
	size_t			i;
	unsigned int	zero;

	zero = 0;
	temp = (unsigned char *)dest;
	i = 0;
	while (i < len)
	{
		temp[i++] = (unsigned int)zero;
	}
}

 

참고 사이트

memset, bzero 함수 구현

 

memset, bzero 함수 구현

틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다! (2021.01.03 내용수정) 2021.01.07 내용 업데이트 💡 💡 memset에 대하여 환경 c, c++ 목적 memset 함수는 어떤 메모리의 시작점부터 연속된

minsoftk.tistory.com

 

memcpy

함수 원형

void	*ft_memcpy(void *dest, const void *src, size_t n)
  1. dest는 목적지
  2. src는 복사 메모리 시작 위치
  3. n은 횟수이지만 바이트 수라고 보면 된다.

source가 가리키는 곳부터 num 바이트 만큼을 destination이 가리키는 곳에 복사함.

memove와 memcpy차이점.

**memcpy**와 **memmove**는 C 언어에서 메모리를 복사하는 함수입니다.

memcpy

**memcpy**는 원본 메모리 영역에서 일정한 크기의 데이터를 가져와서 대상 메모리 영역으로 복사합니다. 이때 원본과 대상 메모리 영역이 겹치면 정의되지 않은 동작을 수행합니다. 따라서, **memcpy**는 일반적으로 메모리 영역이 서로 겹치지 않을 때 사용됩니다.

memove

**memmove**는 **memcpy**와 비슷하지만, 원본과 대상 메모리 영역이 겹치더라도 올바르게 동작합니다. 이를 위해 **memmove**는 임시 버퍼를 사용하거나, 원본 메모리 영역의 데이터를 먼저 복사하여 대상 메모리 영역으로 옮긴 후, 원본 메모리 영역에서 데이터를 삭제합니다.

따라서, 메모리 영역이 겹치지 않는 경우에는 **memcpy**를 사용하고, 겹치는 경우에는 **memmove**를 사용하는 것이 좋습니다.

void	*ft_memcpy(void *dest, const void *src, size_t n)
{
	char		*temp;
	const char	*s;

	if (!n || dest == src)
		return (dest);
	if (dest == NULL && src == NULL)
		return (NULL);
	temp = dest;
	s = src;
	while (n--)
	{
		*temp++ = *s++;
	}
	return (dest);
}

 

그리고 

dest와 src 각각 둘 중에 하나씩 널이 들어온다면 어떻게 될까?

만약 둘 중에 하나라도 0일 때

#include "libft.h"

int main()
{
	char *ptr = "12";

	char *ptr1 = 0;
	memcpy(ptr, ptr1 , sizeof(*ptr));
}

동작은 하되 세그가 뜸

 

undefined behaviour

If I want to reimplement the memcpy in C, should I check for NULL argument?

 

If I want to reimplement the memcpy in C, should I check for NULL argument?

If I want to reimplement the memcpy in C, how should I check for NULL argument? 1.Check if both are NULL if (!dst && !src) return (0); 2.Check if one of them is NULL if (!dst || !src) ...

stackoverflow.com

 

참고 사이트

memcpy, memccpy, memmove 함수 구현 (2021.01.07 업데이트)

 

memcpy, memccpy, memmove 함수 구현 (2021.01.07 업데이트)

(2021.01.03 내용 수정) dest와 src 전부 NULL일때 return (NULL)로 수정 2021.01.07 내용 업데이트 2021.12.02 memmove 내용 수정 💡 memcpy에 대하여 환경 c, c++ c++에서는 c에서는 Prototype void *memcpy(void *dest, const void *s

minsoftk.tistory.com

 

memove

memmove를 하는 경우는 3가지가 있음.

  1. int 타입
  2. char 타입
  3. 자기 자신

3번 째인 자기 자신의 위치에 복사가 좀 복잡함

(1)src < dest

src가 dest 메모리 보다 작을 때는 뒤에서부터 채워줘야함.

왜 그러냐?

앞에서 부터 채워줘버리면 복사를 할 때 복사한 값이 복사되어서 뒤에서 부터 복사를 시작하는 것임

(2)src > dest

앞에서 부터 복사를 하면 된다.

 

#include "libft.h"

void	*ft_memmove(void *dest, const void *src, size_t n)
{
	size_t	i;

	if (dest == NULL && src == NULL)
		return (NULL);
	if (src < dest)
	{
		i = 0;
		while (i < num)
		{
			((unsigned char *)dest)[i] = ((unsigned char *)src)[i];
			i++;
		}
	}
	else
	{
		i = num;
		while (i--)
		{
			((unsigned char *)dest)[i - 1] = ((unsigned char *)src)[i - 1];
		}
	}
}

/*
int main()
{
    char src[] = "BlockDMask";
    int dest[7];

    printf("%c\\n", *(src+0));
    printf("%c\\n", *(src+1));
    printf("%c\\n", *(src+2));
    printf("%c\\n", *(src+3));
    memmove(src+2 , src  , sizeof(char) * 4);
    printf("%s", src);

    int i;
    printf("src p: %x\\n" ,&src);
    for (i = 0; i < 5; i++)
    {
        printf("%d " , src[i]);
    }
    printf("\\n");
    printf("dest p: %x\\n " , &dest);
    int j;
    for ( j = 0; j < 5; j++)
    {
       printf("%d " , dest[j]);
    }
}
 */

src가 dest보다 크면 앞에서 부터 넣고 작으면 뒤에서 부터 넣어야함


memove와 memcpy차이점.

**memcpy**와 **memmove**는 C 언어에서 메모리를 복사하는 함수입니다.

memcpy

**memcpy**는 원본 메모리 영역에서 일정한 크기의 데이터를 가져와서 대상 메모리 영역으로 복사합니다. 이때 원본과 대상 메모리 영역이 겹치면 정의되지 않은 동작을 수행합니다. 따라서, **memcpy**는 일반적으로 메모리 영역이 서로 겹치지 않을 때 사용됩니다.

memove

**memmove**는 **memcpy**와 비슷하지만, 원본과 대상 메모리 영역이 겹치더라도 올바르게 동작합니다. 이를 위해 **memmove**는 임시 버퍼를 사용하거나, 원본 메모리 영역의 데이터를 먼저 복사하여 대상 메모리 영역으로 옮긴 후, 원본 메모리 영역에서 데이터를 삭제합니다.

따라서, 메모리 영역이 겹치지 않는 경우에는 **memcpy**를 사용하고, 겹치는 경우에는 **memmove**를 사용하는 것이 좋습니다.

 

 

참고 사이트

memcpy, memccpy, memmove 함수 구현 (2021.01.07 업데이트)

 

memcpy, memccpy, memmove 함수 구현 (2021.01.07 업데이트)

(2021.01.03 내용 수정) dest와 src 전부 NULL일때 return (NULL)로 수정 2021.01.07 내용 업데이트 2021.12.02 memmove 내용 수정 💡 memcpy에 대하여 환경 c, c++ c++에서는 c에서는 Prototype void *memcpy(void *dest, const void *s

minsoftk.tistory.com

C99 restrict 키워드와 memcpy & memmove 함수

 

C99 restrict 키워드와 memcpy & memmove 함수

1. restrict 키워드

bigpel66.oopy.io

[C언어/C++] memmove 메모리 이동 함수 설명 및 예시

 

[C언어/C++] memmove 메모리 이동 함수 설명 및 예시

안녕하세요. BlockDMask 입니다 오늘은 C, C++에서 메모리 이동을 하는 함수 memmove 라는 함수에 대해서 알아보려고 합니다. 지난시간과 지지난시간에는 메모리를 초기화 하는 memset 함수와 메모리를

blockdmask.tistory.com

 

반응형

'42Seoul > libft' 카테고리의 다른 글

libft - toupper, tolower, strchr  (0) 2023.03.24
libft - strlcpy, strlcat, strncmo  (0) 2023.03.24
libft - isascii, isprint, memset  (0) 2023.03.24
libft - isalpha, isdigit, isalnum  (0) 2023.03.24
Makefile  (0) 2023.03.23