C언어/string.h

[C언어] memset 함수 (메모리 셋팅 함수)

아무일도없었다 2023. 2. 5. 19:51

사용범위

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));

memset(&n, 1, sizeof(int)) 결과

 

1을 넣었고 n의 값이 1 또는 memory에 0x11111111 로 들어갈 거라고 생각했다면 커다란 버그로 이어질 수 있으니 주의해야 한다.

 

이를 조금 응용한다면 memset(&n, 255, sizeof(int)) 를 사용한 재밌는 발상도 할 수 있다.

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

 

반응형