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