배열의 초기화

초기화 방법의 종류

  • 배열의 초기화 방식은 두 가지가 있다.
    1. 배열을 선언한 후 초기화
    1. 배열을 선언할 때 초기화
  • 두 방식에서, 초기화되지 않는 요소의 값은 다르게 지정되니 주의!

1. 배열 선언 후 초기화

  • 직접 정해진 값을 대입하거나 파일 등으로부터 입력한 값을 초깃값으로 저장한다.
  • 어떤 요소의 초깃값이 정해지지 않은 경우, 쓰레기값이 들어간다.
1
2
3
4
5
6
7
8
9
10
11
int main() {
    int array[4];
    array[0] = 10;
    array[1] = 20;
    // array[2] = 30;
    array[3] = 40;
    for (int i=0; i < 4; i++){
        printf("%d\n", array[i]);
    }
    return 0;
}
1
2
3
4
10
20
-64044472
40

2. 배열 선언과 동시에 초기화

  • {} 안에 초깃값을 나열한다.
  • 값의 개수는 배열의 크기보다 클 수 없다.
  • 배열의 크기보다 적은 개수로 값을 나열하면, 배열의 앞에서부터 채워진다.
  • 초깃값이 지정되지 않은 요소는 0으로 초기화된다.
  • 배열 요소의 개수를 지정하지 않은 경우, 나열된 초깃값의 수가 배열의 크기가 된다.

배열의 크기를 지정하지 않은 경우, 나열된 초깃값의 수가 배열의 크기가 된다.

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main() {
    int array[4] = {1, 2, 3};
    int array_length = sizeof(array) / sizeof(array[0]);
    for (int i=0; i < array_length; i++){
        printf("%d\n", array[i]);
    }
    return 0;
}
1
2
3
4
5
# 출력  
1
2
3
0

초기화 값에 차이가 있는 이유

  • C 프로그래밍 언어의 규칙에 따라 이러한 차이가 발생한다.
  • ISO/IEC 9899:2024 (C23)의 6.7.11 문단에서 확인할 수 있다.

6.7.11.11
“If an object that has automatic storage duration is not initialized explicitly, its representation is indeterminate.”
자동 저장 기간의 객체가 명시적으로 초기화되지 않으면, 그 표현은 불확정이다.

6.7.11.20
“all subobjects that are not initialized explicitly are subject to default initialization”
명시적으로 초기화되지 않은 모든 하위 객체는 기본 초기화 대상이다.

6.7.11.22
“If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate is subject to default initialization”
배열의 요소 수보다 초기화자가 적으면, 나머지 요소는 기본 초기화 대상이다.

6.7.11.11.3
“if it has arithmetic type, and it does not have decimal floating type, it is initialized to (positive or unsigned) zero”
기본 초기화 대상인 객체가 산술 타입이면 0으로 초기화된다.

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf

Comments