C 언어에서 배열을 빠르고 효율적으로 초기화하는 다양한 방법
배열을 초기화하는 작업은 C 언어에서 자주 사용되는 기본적인 기능입니다. 하지만 배열의 모든 요소를 특정 값으로 초기화하는 데는 여러 가지 방법이 있습니다. 이번 글에서는 C99 이상의 표준 문법, GNU 확장 기능, 그리고 memset
의 활용법까지 다양한 접근 방식을 다룹니다.
1. 기본 배열 초기화
C 언어에서 배열을 초기화할 때 가장 기본적인 방법은 {}
를 활용하는 것입니다.
1.1. 배열을 0
으로 초기화
다음과 같이 {}
또는 {0}
을 사용하여 배열의 모든 요소를 0
으로 초기화할 수 있습니다.
int array[10] = {0}; // 모든 요소를 0으로 초기화
1.2. 특정 값으로 초기화
특정 값으로 초기화하려면 값을 하나씩 나열해야 합니다.
int array[10] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
하지만 배열이 커질 경우, 이 방법은 비효율적일 수 있습니다.
2. memset
사용하기
memset
은 배열을 특정 값으로 빠르게 초기화하는 데 유용합니다. 하지만 이 함수는 바이트 단위로 값을 설정하기 때문에, 모든 값이 같은 바이트 패턴으로 초기화되어야 합니다.
2.1. memset
예제
#include <string.h>
int array[10];
memset(array, 0, sizeof(array)); // 모든 요소를 0으로 설정
2.2. memset
의 한계
memset
은 정수형 배열에서 동작할 때 주의가 필요합니다. 예를 들어, 배열의 각 요소를 5
로 설정하려고 하면 제대로 작동하지 않습니다. 왜냐하면 5
는 1바이트 단위로 복사되기 때문입니다.
3. C99 이상에서의 문법 활용
3.1. 지정 초기화
C99 이상에서는 "지정 초기화"를 사용할 수 있습니다. 특정 인덱스 또는 범위에 대해 값을 지정할 수 있습니다.
int array[10] = {[0 ... 9] = 5}; // 모든 요소를 5로 초기화
이 문법은 GNU 확장 기능으로 지원되며, 매우 간결한 코드 작성을 가능하게 합니다.
4. GNU 확장 기능: [0 ... N]
GNU 컴파일러(GCC)를 사용하는 경우, 다음과 같은 방식으로 배열의 모든 요소를 간단히 초기화할 수 있습니다.
int array[10] = {[0 ... 9] = 5}; // 배열의 모든 요소를 5로 설정
4.1. 배열 크기 자동 계산
크기를 명시적으로 지정하지 않아도 됩니다.
int array[] = {[0 ... 9] = 5}; // 크기는 자동으로 설정
4.2. 다차원 배열 초기화
2차원 배열도 다음과 같이 초기화할 수 있습니다.
int matrix[3][3] = {[0 ... 2][0 ... 2] = 1}; // 모든 요소를 1로 설정
4.3. 파일 크기 증가 주의
이 방식은 컴파일 후 바이너리 크기가 증가할 수 있습니다. 예를 들어, 초기화 대상 배열의 크기가 클 경우, 초기화 값이 모두 저장되기 때문입니다.
5. 반복 구조로 초기화
초기화가 복잡한 경우 반복문을 활용할 수도 있습니다.
int array[10];
for (int i = 0; i < 10; ++i) {
array[i] = 5;
}
6. 결론
배열 초기화 방법은 배열 크기와 초기화 값의 요구사항에 따라 달라질 수 있습니다. 다음은 상황별 추천 방법입니다:
- 값이
0
일 경우:{0}
또는memset
사용. - 특정 값이 필요할 경우: C99 지정 초기화 또는 GNU 확장 사용.
- 복잡한 초기화: 반복문 활용.
각 방법의 장단점을 고려해 상황에 맞는 최적의 초기화 방식을 선택하세요. C99와 GNU 확장 기능을 적절히 활용하면 더욱 간결하고 효율적인 코드를 작성할 수 있습니다.
Reference
How to initialize all members of an array to the same value?
I have a large array in C (not C++ if that makes a difference). I want to initialize all members of the same value. I could swear I once knew a simple way to do this. I could use memset() in my ca...
stackoverflow.com