728x90
1. memset
void *my_memset(void *s, int c, size_t n);
s
위치부터 n
바이트 만큼 c
값으로 초기화하는 함수
void *my_memset(void *s, int c, size_t n)
{
unsigned char *ptr;
ptr = s;
while (n--)
*ptr++ = (unsigned char)c;
return (s);
}
- 메모리의 1바이트씩 체크와 역참조가 불가능한 void 포인터를
unsigned char
포인터로 형변환 s
의 시작점을ptr
받고n
개 만큼 반복하며 값을 넣어줌
2. bzero
void my_bzero(void *s, size_t n);
s
위치부터 n
바이트 만큼 0으로 초기화하는 함수
void my_bzero(void *s, size_t n)
{
my_memset(s, 0, n);
}
memset
을 활용
3. memcpy
void *my_memcpy(void *dst, const void *src, size_t n);
dst
에 src
의 값들을 n만큼 복사하는 함수
void *my_memcpy(void *dst, const void *src, size_t n)
{
size_t i;
if (dst == NULL && src == NULL)
return (dst);
i = 0;
while (i < n)
{
((unsigned char *)dst)[i] = ((unsigned char *)src)[i];
i++;
}
return (dst);
}
- 이 함수는
src
의 널 종료 문자(null terminating character) 을 검사하지 않는다. 언제나 정확히n
바이트 만큼을 복사 - 만일 두 메모리 블록이 겹쳐져 있다면
memmove
함수를 이용해야 한다.src
의 원본 값이 이전src
로 바뀐 상태에서 복사를 해버리기 때문
4. memccpy
void *my_memccpy(void *dst, const void *src, int c, size_t n);
dst
에 src
의 값들을 n만큼 복사하는 함수, 복사하는 과정에서 c
를 찾게되면 c
까지만 복사하고 중단
void *my_memccpy(void *dst, const void *src, int c, size_t n)
{
size_t i;
int flag;
i = 0;
flag = 0;
while (i < n && ((unsigned char *)src)[i] && !flag)
{
flag = ((unsigned char *)src)[i] == ((unsigned char)c) ? 1 : 0;
i++;
}
if (flag)
{
my_memcpy(dst, src, i);
return (dst + i);
}
else
{
my_memcpy(dst, src, n);
return (0);
}
}
- 복제된 dest변수에서 복제가 끝난 다음 번지를 반환.
- 만약 문자 c를 만나지 않았다면, n바이트를 복제하고 NULL을 반환.
5. memmove
void *my_memmove(void *dst, const void *src, size_t n);
src
메모리 영역에서 dst
메모리 영역으로 n
바이트 만큼 복사.
이 때, src
배열은 src
와 dst
의 메모리 영역과 겹치지 않는 메모리 영역부터 먼저 복사.
void *my_memmove(void *dst, const void *src, size_t n)
{
unsigned char *s;
unsigned char *d;
if (dst == src || !n)
return (dst);
s = (unsigned char *)src;
d = (unsigned char *)dst;
if (dst < src)
{
while (n--)
*d++ = *s++;
}
else
{
while (n--)
*(d + n) = *(s + n);
}
return (dst);
}
- 한 배열 안에서 복사를 수행
- src 시작 주소가 dest 시작 주소보다 앞에 있을 떄, 오버랩의 가능성이 생김
- 따라서 뒤에서부터 한 바이트 씩 복사
6. memchr
void *my_memchr(const void *s, int c, size_t n);
특정 문자를 찾아 그 문자의 주소를 반환하는 함수
void *my_memchr(const void *s, int c, size_t n)
{
unsigned char *ptr;
ptr = (unsigned char *)s;
while (n--)
{
if (*ptr != ((unsigned char)c))
ptr++;
else
return (ptr);
}
return (0);
}
7. memcpm
int my_memcmp(const void *s1, const void *s2, size_t n);
s1
이 가리키는 처음 n
바이트의 데이터와 s2
가 가리키는 처음 n
바이트의 데이터를 비교하는 함수
int my_memcmp(const void *s1, const void *s2, size_t n)
{
const unsigned char *ptr1;
const unsigned char *ptr2;
if (!n)
return (0);
ptr1 = (unsigned char*)s1;
ptr2 = (unsigned char*)s2;
while (n--)
{
if (*ptr1 != *ptr2)
return (*ptr1 - *ptr2);
ptr1++;
ptr2++;
}
return (0);
}
- 비교대상의 차이를 반환
728x90
300x250