Initialization
객체의 선언 은 초기화 라고 알려진 과정을 통해 초기값을 제공할 수 있습니다.
각 선언자 에 대해, 생략되지 않은 초기화자는 다음 중 하나일 수 있습니다:
=
expression
|
(1) | ||||||||
=
{
initializer-list
}
|
(2) | ||||||||
=
{
}
|
(3) | (C23 이후) | |||||||
여기서 initializer-list 는 비어 있지 않은 쉼표로 구분된 initializer 목록(선택적 후행 쉼표 포함)이며, 각 initializer는 다음 세 가지 형태 중 하나를 가집니다:
| expression | (1) | ||||||||
{
initializer-list
}
|
(2) | ||||||||
{
}
|
(3) | (C23부터) | |||||||
designator-list
=
initializer
|
(4) | (C99부터) | |||||||
|
여기서
designator-list
는
참고: 초기화자 외에도 중괄호로 둘러싸인 initializer-list 는 복합 리터럴 에서 나타날 수 있으며, 이는 다음과 같은 형태의 표현식입니다:
|
(C99부터) | ||||||||||||||||||||||||||||||||||||
목차 |
설명
이니셜라이저는 객체에 저장되는 초기값을 지정합니다.
명시적 초기화
초기화자가 제공된 경우, 다음을 참조하십시오
- scalar initialization 스칼라 타입의 초기화
- array initialization 배열 타입의 초기화
- struct initialization 구조체 및 공용체 타입의 초기화
암시적 초기화
초기화자가 제공되지 않는 경우:
빈 초기화
|
객체는 명시적으로 이니셜라이저 = { } 로부터 초기화될 경우 빈 초기화됩니다. |
(since C23) |
어떤 경우에는 객체가 명시적으로 초기화되지 않으면 빈 초기화(empty-initialized)됩니다. 즉:
- 포인터는 해당 타입의 널 포인터 값으로 초기화됩니다
- 정수형 타입의 객체는 부호 없는 0으로 초기화됩니다
- 부동소수점 타입의 객체는 양의 0으로 초기화됩니다
- 배열의 모든 요소, 구조체의 모든 멤버, 그리고 공용체의 첫 번째 멤버는 재귀적으로 빈 초기화되며, 모든 패딩 비트는 0으로 초기화됩니다
- (널 포인터 값과 부동 소수점 0이 모든 비트가 0인 표현을 갖는 플랫폼에서, 정적 변수의 이러한 초기화 형태는 일반적으로 프로그램 이미지의 .bss 섹션에 할당하여 구현됩니다)
참고 사항
정적 또는 스레드 지역 저장 기간 을 가진 객체를 초기화할 때, 초기화 식의 모든 표현식 은 반드시 상수 표현식 이거나 문자열 리터럴 이어야 합니다.
초기화자는 불완전한 타입의 객체, VLA, 그리고 링크를 가진 블록 범위 객체의 선언에서는 사용할 수 없습니다.
함수 매개변수의 초기값은 초기화에 의한 것이 아니라 함수 호출 인수로부터의 할당에 의해 설정됩니다.
부정 값(indeterminate value)이 표준 라이브러리 호출의 인수로 사용되면 동작은 정의되지 않습니다. 그렇지 않은 경우, 부정 값을 포함하는 모든 표현식의 결과는 부정 값입니다 (예: int n ; , n 은 자신과 비교했을 때 같지 않을 수 있으며, 이후 읽기에서 값이 변경되는 것처럼 보일 수 있습니다)
|
C에는 C++의 값 초기화 에 해당하는 특별한 구문이 없습니다. 그러나 = { 0 } (또는 복합 리터럴에서 ( T ) { 0 } ) (C99부터) 를 대신 사용할 수 있습니다. C 표준은 빈 구조체, 빈 공용체 또는 길이가 0인 배열을 허용하지 않기 때문입니다. |
(C23까지) |
|
빈 초기화자 = { } (또는 복합 리터럴에서 ( T ) { } )를 사용하여 C++의 값 초기화 와 동일한 의미를 달성할 수 있습니다. |
(C23부터) |
예제
#include <stdlib.h> int a[2]; // a를 {0, 0}으로 초기화 int main(void) { int i; // i를 불확정 값으로 초기화 static int j; // j를 0으로 초기화 int k = 1; // k를 1로 초기화 // int x[3]을 1,3,5로 초기화 // int* p를 &x[0]으로 초기화 int x[] = { 1, 3, 5 }, *p = x; // w(두 개의 구조체 배열)를 // { { {1,0,0}, 0}, { {2,0,0}, 0} }로 초기화 struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2}; // 함수 호출 표현식은 지역 변수에 사용 가능 char* ptr = malloc(10); free(ptr); // 오류: 정적 저장 기간을 가진 객체는 상수 초기화자가 필요함 // static char* ptr = malloc(10); // 오류: VLA는 초기화할 수 없음 // int vla[n] = {0}; }
참고문헌
- C17 표준 (ISO/IEC 9899:2018):
-
- 6.7.9 초기화 (p: 100-105)
- C11 표준 (ISO/IEC 9899:2011):
-
- 6.7.9 초기화 (p: 139-144)
- C99 표준 (ISO/IEC 9899:1999):
-
- 6.7.8 초기화 (p: 125-130)
- C89/C90 표준 (ISO/IEC 9899:1990):
-
- 6.5.7 초기화
참고 항목
|
C++ documentation
for
Initialization
|