사용범위
Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수
기능
C언어 표준 함수로 메모리를 특정 값으로 setting 시 사용한다.
헤더
#include <string.h>
※ 함수 사용 시 string.h 파일을 include 하지 않는다면 컴파일 시 error 발생 ※
함수
void *memset(void *dest, int val, size_t size);
파라미터
- void *dest
- 메모리를 setting 할 버퍼의 주소를 입력한다.
- int val
- 메모리에 setting 할 value 를 입력한다.
- size_t size
- 버퍼에 value를 setting 할 크기를 byte 단위로 입력한다.
반환 값 (return value)
성공 시 dest 의 주소값을 반환한다.
실패 시 NULL 을 반환한다.
잡학지식
memset 은 버퍼를 입력받아 value 로 size 만큼 채워주는 기능을 제공한다.
header 에는 value 의 type이 int 로 되어있지만 내부 구현에서는 char 로 형변환되어 사용된다.
void *memset(void *s, int c, size_t count)
{
char *xs = s;
while (count--)
*xs++ = c;
return s;
}
왜 char 가 아닌 int 로 받아서 사용하는지는 의문이지만 과거 int 형의 size 가 architecture 에 따라서 달랐다는 점을 생각해 보면 과거 API 개발 시점에는 정확한 size 였지만, 현재는 약간 이상한 스펙이 되었으며 동작시 문제가 발생하지는 않아서 지금까지 사용하는 것으로 예상된다.
따라서 int 의 범위를 넣어도 사실상 0~255 의 범위만 적용된다.
예를 들어 int 변수 n 에 memset 을 사용하여 1 값으로 size(int) 만큼 setting 한다면 아래와 같이 메모리에 setting 될 것이다.
int n;
memset(&n, 1, sizeof(int));
1을 넣었고 n의 값이 1 또는 memory에 0x11111111 로 들어갈 거라고 생각했다면 커다란 버그로 이어질 수 있으니 주의해야 한다.
이를 조금 응용한다면 memset(&n, 255, sizeof(int)) 를 사용한 재밌는 발상도 할 수 있다.
정리하자면 memset 은 memory 를 byte 단위로 특정 value 로 size 만큼 setting 할 수 있는 함수지만, 대부분의 개발자들은 memset 함수의 value 부분을 0으로 넣고 buffer 의 size만큼 0으로 할당하는 ZeroMemory 의 용도로만 사용하고 있다.
(사실 초기화 말고는 사용할 일이 딱히 없어 보이긴 한다.)
<소스 코드>
#include <stdio.h>
#include <string.h>
int main() {
int n;
memset(&n, 255, sizeof(int));
printf("memset(255) = %d\n", n);
memset(&n, -1, sizeof(int));
printf("memset(-1) = %d\n", n);
memset(&n, 0, sizeof(int));
printf("memset(0) = %d\n", n);
return 0;
}
※ 실행 결과
memset(255) = -1
memset(-1) = -1
memset(0) = 0
반응형
'C언어 > string.h' 카테고리의 다른 글
[C언어] strncat 함수 (문자열 연결) (0) | 2023.07.10 |
---|---|
[C언어] strrchr 함수 (문자열의 마지막부터 문자를 검색) (2) | 2023.02.24 |
[C언어] memchr 함수 (버퍼에서 문자 검색) (0) | 2022.12.22 |
[C언어] strchr 함수 (문자열에서 문자 검색) (0) | 2022.12.22 |
[C언어] memcmp 함수 (메모리 비교 함수) (0) | 2022.11.11 |