티스토리 뷰
틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다!
(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문보다는 빠른 속도로 초기화를 시킬수가 있겠네요.
Quora 와 stackoverflow의 질문 답변을 참고하시길 바랍니다.
시간복잡도에 따른 차이라고 설명과 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 내용을 참조했습니다.
'TIL(Today I Learn) > C++' 카테고리의 다른 글
is함수들 구현 (isalpha, isdigit, isascii, isalnum, isspace) (0) | 2021.01.07 |
---|---|
strchr, strnstr, strncmp 함수 구현 (0) | 2021.01.07 |
strlen, strlcpy, strlcat 함수 구현(2021.01.07 업데이트) (21) | 2021.01.03 |
memchr, memcmp 함수 구현 (2021.01.07 업데이트) (2) | 2020.12.29 |
memcpy, memccpy, memmove 함수 구현 (2021.01.07 업데이트) (7) | 2020.12.29 |
- Total
- Today
- Yesterday
- React
- 42서울 라피신
- windows 10 ubuntu
- 프로그래머스 자바
- 42서울 합격
- C언어문제
- c언어 함수
- JavaScript
- C언어
- css
- git vi
- Git
- c언어알고리즘
- 42서울 합격 후기
- 프로그래머스 코테
- html
- C언어 문제
- 백준
- 프로그래머스 코딩테스트
- 마크다운 이미지 업로드
- 알고리즘
- flexbox
- 프로그래머스 카카오
- HEXO
- 자바스크립트
- 42seoul
- JS
- 42서울
- vscode
- vscode commit vi
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |