배열 초기화 - memset, fill
memset - 바이트 단위
- 설명: 메모리 블록의 모든 바이트를 특정 값으로 초기화
- 용도: 배열 또는 메모리를 특정 값(바이트 단위)으로 초기화할 때 사용.
- 특징:
- 바이트 단위로 동작: value는 0~255 범위의 값을 사용.
- 모든 바이트가 동일한 값으로 설정됨.
- 값을 일일히 for문으로 넣는 것보다 훨씬 빠르다.
사용법
void* memset(void* ptr, int value, size_t num);
- ptr: 메모리 블록의 시작 주소.
- value: 설정할 값 (하위 8비트만 사용됨).
- num: 설정할 바이트 수.
사용예시
int arr[5];
memset(arr, 0, sizeof(arr)); // 모든 바이트를 0으로 초기화
주의사항
- 바이트 단위로 동작하므로, int와 같은 다바이트 데이터 초기화에 적합하지 않음 (예: 0 이외의 값 설정).
아래 예시의 경우 char arr[rows][cols] 일 때는 올바르게 동작하지만 int arr[rows][cols]일 때에는 동작하지 않는다.
#include <stdio.h>
#include <string.h>
int main() {
int rows = 4; // 행 수
int cols = 3; // 열 수
char arr[rows][cols]; // 2차원 배열 선언
// 배열을 3으로 초기화
memset(arr, 3, sizeof(arr));
// 초기화된 배열의 내용 출력
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
왜 그럴까?
1. memset은 항상 바이트 단위로 동작한다.
2. 배열의 요소 크기가 1바이트(char)일 경우, 초기화 값이 배열 값과 직접적으로 일치한다.
3. 배열의 요소 크기가 4바이트(int) 이상일 경우, 각 요소는 4개의 바이트(예: 0x01010101)로 해석되기 때문에 초기화 결과가 다르게 나타난다.
bool 타입일 때는 memset
int 타입일 때는 fill로 초기화하는 게 마음 편한 일,,
std::fill - 데이터타입 단위
- C에는 없다고 함,, ^^,,ㅎ
- 설명: C++ STL에서 제공하는 함수로, 범위 내의 값을 지정된 값으로 설정
- 용도: 배열이나 컨테이너의 요소를 특정 값으로 초기화할 때 사용.
- 특징:
- 데이터 타입에 관계없이 원하는 값을 설정 가능.
- 안전하고 가독성이 높으며, C++ 스타일 코드에 적합.
사용법
void std::fill(ForwardIterator first, ForwardIterator last, const T& value);
- first: 범위의 시작 반복자.
- last: 범위의 끝 반복자 (포함되지 않음).
- value: 설정할 값.
예제
int arr[5];
std::fill(std::begin(arr), std::end(arr), 42); // 배열 전체를 42로 초기화
주의
컨테이너의 요소를 하나씩 초기화하므로, 원시 메모리 조작이 필요할 때는 적합하지 않음.
'IVS > C 프로그래밍' 카테고리의 다른 글
[C] 메모리 관련 (0) | 2025.01.13 |
---|---|
[C] const 키워드 (0) | 2025.01.13 |
[C] 형변환, 비트연산자 (1) | 2025.01.13 |
[C++] 문자열 처리- strcmp, strcpy, strcat (0) | 2025.01.09 |
[C++] 공백있는 문자열 입력받기 - getline (2) | 2025.01.09 |