반응형
memset 함수는 memory + set 으로 특정 메모리 공간에 지정한 값을 채워준다.
함수 원형
void* memset(void* ptr, int value, size_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] 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 |
댓글