본문 바로가기
프로그래밍 언어/C 언어

[C / C++] memset 함수 사용

by 까망 하르방 2021. 9. 11.
반응형

memset 함수는 memory + set 으로 특정 메모리 공간에 지정한 값을 채워준다.

 

함수 원형

void* memset(void* ptrint valuesize_t num);

→ memset (시작 포인터, 설정할 값, 크기)

① void* ptr 메모리 시작 주소 

② int value 설정하고자 하는 값

                        int 타입으로 받지만 내부에서는 unsigned char (1 byte)로 변환

③ size_t num 메모리 크기 (바이트 단위)

                          주로 sizeof() 를 활용한다. 

 

반환

- 성공하면 첫번째 인자로 들어간 ptr 반환

- 실패하면 NULL 반환

 

헤더파일

(C) #include <memory.h> 혹은 #include <string.h>

(C++) #include <cstring>

 

예시

[예제 1]

#include <stdio.h>
#include <string.h>

const int MAX_N = 5;

int main() {
    int arr[MAX_N];
    for (int i = 0; i < MAX_N; i++)
    {
        printf("%d ", *(arr + i));
    }
    puts("");


    // int 크기 * 5 만큼 [0] 으로 초기화
    memset(arr, 0, sizeof(int) * MAX_N);


    for (int i = 0; i < MAX_N; i++) {
        printf("%d ", *(arr + i));
    }
    puts("");
}

 

[예제 2]

#include <string.h>
#include <stdio.h>

int main() 
{
    char arr[20];

    // 1바이트(8비트)마다 모두 65로 초기화
    memset(arr, 65, sizeof(arr));

    for (int i = 0; i < (sizeof(arr) / sizeof(char)); i++)
    {
        printf("%c ", arr[i]);
    }
    puts("");
}

 

[예제 3]

#include <string.h>
#include <stdio.h>

int main() 
{
    char name[] = "harbang";
    memset(name, 'A', sizeof(char) * 3);
    printf("%s\n", name);
}

 

성능 예제

Q) 숫자 배열을 「 0 」 으로 초기화할 때, for 문으로 직접적으로 초기화하는 것과

     memset으로 초기화하는 것에 성능차이가 있을까?

A) 컴파일러와 아키텍처에 따라 결과가 다를 수 있다.

#include <stdio.h>
#include <string.h>
#include <time.h>

const int MAX_N = 1e8;
int arr[MAX_N];

int main() {
    
    // ------------------------------------------------------------
    // memset 시간 측정
    // ------------------------------------------------------------
    clock_t start = clock();
    memset(arr, 0, sizeof(int) * MAX_N);
    clock_t end = clock();
    printf("memset 소요 시간: %lf\n", (double)(end - start) / CLOCKS_PER_SEC);


    // ------------------------------------------------------------
    // for문 시간 측정
    // ------------------------------------------------------------
    start = clock();
    for (int i = 0; i < MAX_N; ++i)
    {
        *(arr + i) = 0;
    }
    end = clock();
    printf("for문 소요 시간: %lf\n", (double)(end - start) / CLOCKS_PER_SEC);
}

* 알고리즘 풀이에서도 초기화 해줄  때, 유용하게 사용할 수 있다.

   ex) 초기화된 값으로 2번 이상 사용해야 하는 경우

* fill 함수로도 처리할 수 있다.

 

Reference

윈도우 계산기 (프로그래머용) 

[C/C++] memset 사용시 주의사항 

[C++] [STL] fill 함수 사용해보기 

반응형

'프로그래밍 언어 > C 언어' 카테고리의 다른 글

[C] printf 서식  (0) 2021.09.14
[C/C++] memset 사용시 주의사항  (0) 2021.09.11
[C] typedef enum 활용  (0) 2021.09.11
[C] 로그(log) 함수  (0) 2021.09.01
[C] 함수 포인터와 void 포인터  (0) 2021.03.20

댓글