티스토리 뷰

틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다!

(2021.01.03 내용수정)

2021.01.07 내용 업데이트 💡


💡 memset에 대하여

환경

  • c, c++


목적

  • memset 함수는 어떤 메모리의 시작점부터 연속된 범위를 어떤 값으로(바이트 단위) 모두 지정하고 싶을때 사용하는 함수이다.
void *memset(void *dest, int value, size_t count);
  • dest : 채우고자 하는 메모리의 시작 포인터(시작 주소)
  • value : 메모리에 채우고자 하는 값, int형 이지만 내부에서는 unsigned char(1 byte)로 변환되어서 저장된다.
  • count : 채우고자 하는 바이트의 수. 즉, 채우고자 하는 메모리의 크기



return value

  • memset()함수는 dest에 대한 포인터를 return 합니다.

    #include <string.h> // string.h 파일이 필요합니다.
    #include <stdio.h>
    
    int main (){
    
        char a[20];
    
        // 1바이트마다 모두 65로 초기화
        // 배열을 채울 때는 sizeof()함수를 사용하면 됩니다.
        // sizeof 함수 - 배열의 전체 바이트 크기를 반환합니다.
        memset(a, 65, sizeof(a));
    
        // 출력을 통해 확인
        for(int i=0; i< (sizeof(a)/sizeof(char)); i++){
            printf("%c\n",a[i]);
        }
    
    }
    
    // 즉, char라는 배열의 값을 모두 65인 'A'로 채워주게 됩니다.
    // memset에서 dest라는 배열의 주소값을 return 받습니다. 따라서 for문을 통해
    // a 배열의 출력을 확인할 수 있습니다.



memset 함수의 구현

#include <string.h> //NULL과 size_t를 쓰기 위한 헤더
void                *ft_memset(void *dest, int value, size_t count)
{
    size_t            i;
    unsigned char    *temp;

    temp = (unsigned char *)dest;
    i = 0;
    while (i < count)
        temp[i++] = (unsigned char)value;
    return (temp);
}

1byte의 입력이 기준이 됩니다. 4byte의 처리는 어셈블리어로 접근을 해야된다더군요.

int형의 사이즈인 4byte를 처리해주는 것이 궁금하신 분들은 요기를 참고해보세요!



memset 함수를 사용하는 이유?

처음에는 memset 함수를 왜 사용하는지 이해가 잘 안갔습니다. 쓰는 이유가 있긴한데, 속도측면에서 for문보다 우월하다고 합니다. 따라서 만약 초기화해야하는 배열의 크기가 엄청 크다면 for문보다는 빠른 속도로 초기화를 시킬수가 있겠네요.

Quorastackoverflow의 질문 답변을 참고하시길 바랍니다.

시간복잡도에 따른 차이라고 설명과 PC의 설계 관점으로 접근을 하는데

저한테는 너무 어렵군요..ㅎㅎ



💡 bzero에 대하여

환경

  • c (현재는 잘 쓰이지않는 deprecated된 함수)

4.3BSD. This function is deprecated (marked as LEGACY in
POSIX.1-2001): use memset(3) in new programs. POSIX.1-2008
removes the specification of bzero().

-> memset을 쓰라고 한다.

출처: https://yaaam.tistory.com/entry/CC-bzero-와-memset의-차이점 [시 쓰는 개발자]



목적

  • bzero 함수는 어떤 메모리의 시작점부터 연속된 범위를 0으로 모두 지정하고 싶을때 사용하는 함수이다.
void        *ft_bzero(void *dest, size_t len)
  • dest : 채우고자 하는 메모리의 시작 포인터(시작 주소)

  • len : 메모리에 채우고자 하는 값, int형 이지만 내부에서는 unsigned char(1 byte)로 변환되어서 저장된다.



return value

  • bzero()함수는 dest에 대한 포인터를 return 합니다.

    #include <string.h> // string.h 파일이 필요합니다.
    #include <stdio.h>
    
    int main (){
    
        char a[20];
    
        // 1바이트마다 모두 65로 초기화
        // 배열을 채울 때는 sizeof()함수를 사용하면 됩니다.
        // sizeof 함수 - 배열의 전체 바이트 크기를 반환합니다.
        bzero(a, sizeof(a));
    
        // 출력을 통해 확인
        for(int i=0; i< (sizeof(a)/sizeof(char)); i++){
            printf("%c\n",a[i]);
        }
    
    }
    
    // 즉, char라는 배열의 값을 모두 0으로 채워주게 됩니다.
    // bzero에서 dest라는 배열의 주소값을 return 받습니다. 따라서 for문을 통해
    // a 배열의 출력을 확인할 수 있습니다.



bzero 함수의 구현

#include <string.h> //NULL과 size_t를 쓰기 위한 헤더
void        *ft_memset(void *dest, int value, size_t count);

void        *ft_bzero(void *dest, size_t len)
{
    ft_memset(dest, 0, len);
}

void        *ft_memset(void *dest, int value, size_t count)
{
    size_t            i;
    unsigned char    *temp;

    temp = (unsigned char *)dest;
    i = 0;
    while (i < count)
        temp[i++] = (unsigned char)value;
    return (temp);
}

memset함수를 사용해서 구현이 가능합니다. 쓰임이 비슷해 memset만 만든다면 bzero는 저렇게 만들어도 되겠습니다. 현재는 잘 쓰이지 않는다고하니 memset을 쓰시면 되겠습니다.





reference :

TWpower's Tech blog 의 memset 내용을 참조했습니다.

728x90
반응형