bezro
함수원형
void ft_bzero(void *dest, size_t len);
- dest는 저장할 메모리 주소 시작 지점
- 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;
}
}
참고 사이트
memcpy
함수 원형
void *ft_memcpy(void *dest, const void *src, size_t n)
- dest는 목적지
- src는 복사 메모리 시작 위치
- 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?
참고 사이트
memcpy, memccpy, memmove 함수 구현 (2021.01.07 업데이트)
memove
memmove를 하는 경우는 3가지가 있음.
- int 타입
- char 타입
- 자기 자신
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 업데이트)
C99 restrict 키워드와 memcpy & memmove 함수
[C언어/C++] memmove 메모리 이동 함수 설명 및 예시
'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 |