집계 형식은 구조체, 공용 구조체 또는 배열 형식입니다. 집계 형식에 집계 형식의 멤버가 포함된 경우 초기화 규칙이 재귀적으로 적용됩니다.
문법
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의 첫 번째 왼쪽 중괄호는 컴파일러에 첫 번째 집계 멤버(즉,
nlist[0])의nlist초기화가 시작됨을 알릴 수 있습니다.두 번째 왼쪽 중괄호는 첫 번째 집계 멤버(즉, 구조체 위치
nlist[0][0])의nlist[0]초기화가 시작되었음을 나타냅니다.첫 번째 오른쪽 중괄호는 구조
nlist[0][0]체의 초기화를 종료합니다. 다음 왼쪽 중괄호는 초기화를nlist[0][1]시작합니다.이 프로세스는 줄의 끝까지 계속됩니다. 여기서 닫는 오른쪽 중괄호는 초기화를
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으로 초기화됩니다.