집계 형식 초기화

"집계" 형식에는 구조체, 공용 구조체 또는 배열 형식입니다.집계 형식은 집계 형식 멤버를 포함 하는 경우 초기화 규칙에 반복적으로 적용 됩니다.

구문

  • 이니셜라이저:
    { 이니셜라이저 목록} / *의 집합체 초기화 * /

    { initializer-list , }

  • 이니셜라이저 목록은:
    이니셜라이저

    이니셜라이저 목록은 , 이니셜라이저

해당 이니셜라이저 목록 은 이니셜라이저 쉼표로 구분 된 목록입니다.각 이니셜라이저 목록에서 이니셜라이저 목록 또는 상수 식입니다.이니셜라이저 목록에서 중첩 될 수 있습니다.이 형식은이 절에 있는 예제와 같이 집계 유형의 집계 멤버를 초기화 하는 유용 합니다.그러나 자동 식별자에 대 한 이니셜라이저 식을 하나만 있으면 상수 식 하지 는지 않습니다. 단순히 적절 한 형식에 할당 하는 식별자가 필요 합니다.

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

경우 이니셜라이저 목록 은 는 집계 유형, 나머지 구성원 또는 집계 유형의 요소를 0으로 초기화 됩니다 것 보다 적게 값이 있습니다.초기 값을 명시적으로 초기화 자동 식별자는 정의 되지 않습니다.경우 이니셜라이저 목록 은 는 집계 형식 보다 더 많은 값이 있으면 오류가 발생 합니다.이러한 규칙은 집계 뿐만 아니라 각 포함 된 이니셜라이저 목록에 전체적으로 적용 됩니다.

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

공용 구조체 초기화 될 때 이니셜라이저 목록 은 단일 상수 식 이어야 합니다.상수 식의 값은 공용 구조체의 첫 번째 구성원에 할당 됩니다.

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

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

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

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

Microsoft 전용

최대 크기 배열에 의해 정의 됩니다 size_t.STDDEF 헤더 파일에 정의 됩니다.H, size_t 되는 unsigned int 0x00000000 0x7cffffff의 범위와.

Microsoft 특정 끝

예제

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

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

이 문은 선언 P 4-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 세 명의 구성원을 가진 각 구조체는 구조체를 2-3 배열로 선언 되었습니다.초기화의 1 행 1의 첫 번째 행에 값이 지정 nlist, 다음과 같이 하십시오.

  1. 첫 번째 왼쪽된 중괄호의 첫 번째 행의 첫 번째 집계 멤버의 초기화 컴파일러 알립니다 nlist (즉, nlist[0]) 시작 됩니다.

  2. 두 번째 왼쪽된 중괄호의 첫 번째 집계 멤버의 초기화를 나타내는 nlist[0] (즉, 구조에서 nlist[0][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 줄에서 시작 nlist[0], 세 가지 구조체의 배열입니다.값 1, 2, 3 세 첫 번째 구조체 멤버에 할당 됩니다.다음 오른쪽 중괄호 때 발생된 (후 값 3)를 초기화 하는 nlist[0] 완료 되 고 세 구조 배열의 나머지 두 구조체는 자동으로 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으로 초기화 됩니다.마찬가지로 두 번째 행의 첫 번째 요소 x 문자를 초기화 됩니다 4, 한 행에 있는 나머지 두 개의 요소 값 0으로 초기화 됩니다.

참고 항목

개념

초기화