ft_memset 구현

yeonjkim·2021년 5월 26일
0

42seoul-libft

목록 보기
40/43

1. ft_memset 용도

* 이 함수는 파라미터로 void *b, int c, size_t len을 가진다.

* b를 len의 범위만큼 c로 초기화하고 b의 주소를 리턴하는 함수이다.

2. ft_memset 프로토타입

void	*ft_memset(void *b, int c, size_t len)
void *b : 초기화하려는 메모리의 시작 주소
int c : b에 채우려는 값, 내부에서 unsigned char형으로 변환됨.
size_t len : b에서 초기화하고자 하는 메모리 바이트 수

3. 구현 시 유의사항

  • 값을 모두 채우고 b의 주소값을 반환함에 주의.

<중요>

  • 채울 문자 c는 int로 주어지기 때문에 unsigned char로 형변환하여 검색한다.
    --> char로 형변환하지 않는 이유는, 특정 아키텍쳐 cpu를 사용하는 환경에서는 unsigned char가 디폴트이다.
    이러한 환경에서 char을 사용했을 때 unsigned char로 바뀌어 적용된다.
    이렇듯 char을 이용했을 때 환경마다 다르게 동작할 수 있기 때문에 관례상 unsigned char을 이용한다.

  • b를 unsigned char *로 형변환해야 한다.

    --> unsigned char모든 bit를 투명하게 볼 수 있는 특성을 제공한다.
    즉 다른 type은 내부 비트의 일부를 값을 표현하기 위한 용도가 아닌 다른 용도로 사용할 수 있으나 unsigned char는 이것이 허락되지 않아 mem함수, str함수에서는 unsigned char을 이용한다.

또한 메모리 주소의 경우 부호 있는 정수 타입을 쓰면 안된다.

  • void 포인터 연산 시 unsigned char 포인터를 이용한다.
    --> void 포인터 연산은 호환성을 위해 사용하지 않는 것이 좋다. 메모리 주소에 부호 있는 정수 타입을 쓰면 올바르게 동작하지 않기 때문에 비부호로 처리해야 한다.

    void 포인터의 경우 음수를 저장할 때 2의 보수 형태로 저장하게 된다. 단순히 부호 여부가 아닌 데이터를 저장하는 방식이 달라진다고 한다.
    참고 : 링크텍스트

4. 코드 구현

#include "libft.h"

void                            *ft_memset(void *b, int c, size_t len)
{
        size_t                  index;
        unsigned char   *ret;

        index = 0;
        ret = (unsigned char*)b;
        while (index < len)
        {
                ret[index] = (unsigned char)c;
                index++;
        }
        return (ret);
}

5. 코드 구현 방법

(1) size_t len과 index를 비교할 것이기 때문에 index는 size_t로 선언
(2) b를 unsigned char *으로 형변환 한 ret변수.
(3) ret[index]를 (unsigned char)(c)로 채우기.
(4) n byte까지 모두 c로 채운 후에는 ret의 주소값 반환

0개의 댓글