다음을 통해 공유


집계 형식 초기화

집계 형식은 구조체, 공용 구조체 또는 배열 형식입니다. 집계 형식에 집계 형식의 멤버가 포함된 경우 초기화 규칙이 재귀적으로 적용됩니다.

문법

initializer:
{ initializer-list } /* 집계 초기화의 경우 */
{ initializer-list , }

initializer-list:
initializer
initializer-list , initializer

쉼표로 구분된 이 initializer-list 니셜라이저 목록입니다. 목록의 각 이니셜라이저는 상수 식 또는 이니셜라이저 목록입니다. 따라서 이니셜라이저 목록을 중첩할 수 있습니다. 이 양식은 이 섹션의 예제와 같이 집계 형식의 집계 멤버를 초기화하는 데 유용합니다. 그러나 자동 식별자에 대한 이니셜라이저가 단일 식인 경우 상수 식일 필요는 없습니다. 식별자에 할당하기 위한 적절한 형식만 있으면 됩니다.

각 이니셜라이저 목록에 대해 상수 식의 값은 집계 변수의 해당 멤버에 순서대로 할당됩니다.

집계 형식보다 값이 적은 경우 initializer-list 집계 형식의 나머지 멤버 또는 요소가 0으로 초기화됩니다. 명시적으로 초기화되지 않은 자동 식별자의 초기 값은 정의되지 않습니다. 집계 형식보다 더 많은 값이 있는 경우 initializer-list 오류가 발생합니다. 이러한 규칙은 포함된 각 이니셜라이저 목록과 집계 전체에 적용됩니다.

구조체의 이니셜라이저는 동일한 형식의 식이거나 중괄호({ })로 묶인 멤버에 대한 이니셜라이저 목록입니다. 명명되지 않은 비트 필드 멤버는 초기화되지 않습니다.

공용 구조체가 초기화 initializer-list 되면 단일 상수 식이어야 합니다. 상수 식의 값은 공용 구조체의 첫 번째 멤버에 할당됩니다.

배열의 크기를 알 수 없는 경우 이니셜라이저의 수에 따라 배열의 크기가 결정되고 해당 형식이 완료됩니다. C에서 이니셜라이저의 반복을 지정하거나 이전 값을 모두 제공하지 않고 배열 중간에 있는 요소를 초기화할 수 있는 방법은 없습니다. 프로그램에서 이 작업이 필요한 경우 어셈블리 언어로 루틴을 작성합니다.

이니셜라이저의 수는 배열의 크기를 설정할 수 있습니다.

int x[ ] = { 0, 1, 2 }

그러나 크기를 지정하고 잘못된 수의 이니셜라이저를 지정하면 컴파일러에서 오류가 발생합니다.

Microsoft 전용

배열의 최대 크기는 .에 의해 size_t정의됩니다.

Microsoft 전용 종료

예시

이 예제에서는 배열에 대한 이니셜라이저를 보여 줍니다.

int P[4][3] =
{
    { 1, 1, 1 },
    { 2, 2, 2 },
    { 3, 3, 3,},
    { 4, 4, 4,},
};

이 문은 P 4-by-3 배열로 선언하고 첫 번째 행의 요소를 1로, 두 번째 행의 요소를 2로, 네 번째 행을 통해 초기화합니다. 세 번째 및 네 번째 행의 이니셜라이저 목록에는 마지막 상수 식 뒤의 쉼표가 포함됩니다. 마지막 이니셜라이저 목록({4, 4, 4,},)도 쉼표 뒤에 잇습니다. 이러한 추가 쉼표는 허용되지만 필수는 아닙니다. 상수 식을 서로 구분하는 쉼표와 한 이니셜라이저 목록을 다른 이니셜라이저 목록과 구분하는 쉼표만 필요합니다.

집계 멤버에 포함된 이니셜라이저 목록이 없는 경우 값은 하위 집계의 각 멤버에 순서대로 할당됩니다. 따라서 이전 예제의 초기화는 다음 예제와 동일합니다.

int P[4][3] =
{
   1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};

중괄호는 목록의 개별 이니셜라이저 주위에 표시될 수도 있으며 예제를 명확히 하는 데 도움이 됩니다.

집계 변수를 초기화할 때는 중괄호 및 이니셜라이저 목록을 올바르게 사용해야 합니다. 다음 예제에서는 컴파일러의 중괄호 해석을 자세히 보여 줍니다.

typedef struct
{
    int n1, n2, n3;
} triplet;

triplet nlist[2][3] =
{
    { {  1, 2, 3 }, {  4, 5, 6 }, {  7, 8, 9 } },  /* Row 1 */
    { { 10,11,12 }, { 13,14,15 }, { 16,17,18 } }   /* Row 2 */
};

이 예제 nlist 에서는 각 구조체에 3개의 멤버가 있는 구조체의 2-by 3 배열로 선언됩니다. 초기화의 행 1은 다음과 같이 첫 번째 행에 nlist값을 할당합니다.

  1. 행 1의 첫 번째 왼쪽 중괄호는 컴파일러에 첫 번째 집계 멤버(즉, nlist[0])의 nlist 초기화가 시작됨을 알릴 수 있습니다.

  2. 두 번째 왼쪽 중괄호는 첫 번째 집계 멤버(즉, 구조체 위치nlist[0][0])의 nlist[0] 초기화가 시작되었음을 나타냅니다.

  3. 첫 번째 오른쪽 중괄호는 구조 nlist[0][0]체의 초기화를 종료합니다. 다음 왼쪽 중괄호는 초기화를 nlist[0][1]시작합니다.

  4. 이 프로세스는 줄의 끝까지 계속됩니다. 여기서 닫는 오른쪽 중괄호는 초기화를 nlist[0]종료합니다.

행 2는 비슷한 방식으로 두 번째 행에 nlist 값을 할당합니다. 행 1과 2에 이니셜라이저를 둘러싸는 중괄호의 외부 집합이 필요합니다. 외부 중괄호를 생략하는 다음 생성으로 인해 오류가 발생합니다.

triplet nlist[2][3] =  /* THIS CAUSES AN ERROR */
{
     {  1, 2, 3 },{  4, 5, 6 },{  7, 8, 9 },   /* Line 1 */
     { 10,11,12 },{ 13,14,15 },{ 16,17,18 }    /* Line 2 */
};

이 생성에서 줄 1의 첫 번째 왼쪽 중괄호는 3개의 구조체 배열인 초기화를 nlist[0]시작합니다. 값 1, 2 및 3은 첫 번째 구조체의 세 멤버에 할당됩니다. 다음 오른쪽 중괄호가 발견되면(값 3 이후) 초기화 nlist[0] 가 완료되고 3 구조 배열의 나머지 두 구조체가 자동으로 0으로 초기화됩니다. 마찬가지로 두 { 4,5,6 } 번째 행 nlist의 첫 번째 구조를 초기화합니다. 나머지 두 구조체는 nlist[1] 0으로 설정됩니다. 컴파일러가 다음 이니셜라이저 목록() { 7,8,9 } 을 발견하면 초기화를 시도합니다 nlist[2]. nlist 행이 두 개뿐이므로 이 시도로 인해 오류가 발생합니다.

다음 예제에서는 세 int 멤버가 x 각각 1, 2 및 3으로 초기화됩니다.

struct list
{
    int i, j, k;
    float m[2][3];
} x = {
        1,
        2,
        3,
       {4.0, 4.0, 4.0}
      };

구조체 list 에서 첫 번째 행의 m 세 요소는 4.0으로 초기화되고 나머지 행의 m 요소는 기본적으로 0.0으로 초기화됩니다.

union
{
    char x[2][3];
    int i, j, k;
} y = { {
            {'1'},
            {'4'}
        }
      };

이 예제에서 공용 구조체 변수 y가 초기화됩니다. 공용 구조체의 첫 번째 요소는 배열이므로 이니셜라이저는 집계 이니셜라이저입니다. 이니셜라이저 목록은 {'1'} 배열의 첫 번째 행에 값을 할당합니다. 목록에 값이 하나만 표시되므로 첫 번째 열의 요소가 문자 1로 초기화되고 행의 나머지 두 요소는 기본적으로 값 0으로 초기화됩니다. 마찬가지로 두 번째 행의 첫 번째 요소가 문자4로 초기화되고 행의 x 나머지 두 요소가 값 0으로 초기화됩니다.

참고하십시오

초기화