include
#include <string.h> void *memset(void *b, int c, size_t len);
인자
- b
초기화를 진행할 포인터로 void * 의 형태이기 때문에 string뿐 아니라 다양한 값이 들어올 수 있다.- c
c로 초기화를 진행한다.- len
b에서 부터 len byte만큼 초기화를 진행한다.
memset
함수는 b
에서부터 len byte
까지 c
로 초기화 시켜주는 함수이다.
memset도 bzero처럼 함수 내부에서 b를 unsigned char
로 캐스팅 해준다. 그 이유는 unsigned char같은 경우에는 해당 변수 안의 모든 값이 부호비트
나 패딩비트같이 어떠한 용도로 사용되는 값이 있지 않고 우리가 전달하고자 하는 값으로 모두 차 있다. 그렇기 때문에 mem함수나 str함수 같이 메모리영역에 직접적으로 하나씩 접근하는 녀석
들은 unsigned char로 바꿔서 접근하면 좋다고 한다.
여기에서 문득 궁금한 점이 생긴다. int형 배열도 초기화가 될까??
물론 되지 않는다. 이유는 memset은 1바이트 단위로 접근하여 초기화
시키는 녀석이기 때문에 4byte의 크기를 갖고 있는 int형에게는 적합하지 않다.
한번 해 보도록 하자.
이렇게 2byte를 3으로 초기화 시키면 어떻게 될까??
결과는
한번 int안을 뜯어보자.
00000000
00000000
00000011
00000011
이렇게 채워져 있다.
즉 3(00000011)
이 두번 채워져서 771
이 나온 것이다. 이렇기 때문에 int형에는 사용이 불가능 하다. 하지만 -1이나 0처럼 모든 비트가 같다면
사용이 가능하다.
들어온 b의 주소를 그대로 돌려준다.