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

[C/C++] 배열 초기화 - memset, fill

by 코곰_ 2025. 1. 13.

 

배열 초기화 - 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