C에서 정적 변수의 초기화
C의 정적 변수 초기화에 대해 질문이 있습니다.기본적으로 값이 다음과 같은 글로벌 정적 변수를 선언하면 알 수 있습니다.0
예:
static int a; //although we do not initialize it, the value of a is 0
그러나 다음과 같은 데이터 구조는 어떻습니까?
typedef struct
{
int a;
int b;
int c;
} Hello;
static Hello hello[3];
의 각 구조에 있는 모든 구성원입니다.hello[0]
,hello[1]
,hello[2]
로 초기화된.0
?
예, 정적 스토리지가 있는 개체에 대해 모든 멤버가 초기화됩니다.C99 표준(PDF 문서)의 6.7.8/10 참조
자동 저장 기간이 있는 개체가 명시적으로 초기화되지 않으면 값이 결정되지 않습니다.정적 저장 기간이 있는 개체가 명시적으로 초기화되지 않은 경우:
포인터 유형이 있으면 null 포인터로 초기화됩니다.
산술 유형이 있는 경우 0으로 초기화됩니다(양 또는 부호 없음).
집합체인 경우, 모든 구성원은 본 규칙에 따라 (사전에) 초기화됩니다.
조합인 경우, 첫 번째 명명된 구성원은 이러한 규칙에 따라 (사전에) 초기화됩니다.
개체의 모든 항목을 초기화하는 데 사용됩니다.static
아니면 0으로 범용 제로 이니셜라이저를 사용하고 싶습니다.
sometype identifier0 = {0};
someothertype identifier1[SOMESIZE] = {0};
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0};
C에는 부분 초기화가 없습니다.개체가 완전히 초기화되었습니다(으).0
다른 값이 없는 경우 올바른 종류) 또는 전혀 초기화되지 않았습니다.
부분 초기화를 원하는 경우 처음부터 초기화할 수 없습니다.
int a[2]; // uninitialized
int b[2] = {42}; // b[0] == 42; b[1] == 0;
a[0] = -1; // reading a[1] invokes UB
예, 정적 또는 스레드 저장 기간이 있는 한 그렇습니다.
C11 (n1570), § 6.7.9 초기화 #10
정적 또는 스레드 저장 기간이 있는 개체가 명시적으로 초기화되지 않은 경우:
[...]
- 산술 유형이 있는 경우 0으로 초기화됩니다(양 또는 부호 없음).
- Aggregate인 경우, 모든 멤버는 이 규칙에 따라 (연속적으로) 초기화되고, 패딩은 0비트로 초기화됩니다.
[...]
예, 파일 범위 정적 변수는 구조물, 배열 등의 모든 구성원을 포함하여 0으로 초기화됩니다.
참고를 위해 이 질문을 참조하십시오(이 질문도 중복으로 종결하도록 투표하겠습니다).
편집: 이 질문은 훨씬 더 나은 답변을 얻고 있습니다. 그래서 저는 그 질문을 이 질문의 중복으로 끝내기 위해 투표합니다.
참고로, 여기에 링크된 C99 및 C11 표준은 물론 표준이지만, 해당 질문의 수락된 답변에서 나온 C FAQ 링크가 있습니다.
정적 변수(또는 배열)는 두 가지 유형으로 분류됩니다.
초기화는 컴파일 시 코드에서 값이 제공되는 것입니다.이것들은 보통 DS에 저장되지만 컴파일러마다 다릅니다.
다른 유형은 실행 시 초기화되지 않은 통계로, BSS 세그먼트에 저장되지만 컴파일러별로 다릅니다.
표준을 읽고 싶지 않은 사람들을 위해, 그것은 https://en.cppreference.com/w/c/language/initialization 에도 언급되어 있습니다.
암시적 초기화
이니셜라이저가 제공되지 않는 경우:
- 자동 저장 기간이 있는 개체는 불확실한 값(트랩 표현일 수 있음)으로 초기화됩니다.
- 정적 및 스레드 로컬 스토리지 기간이 있는 개체가 0 초기화됩니다.
언급URL : https://stackoverflow.com/questions/13251083/the-initialization-of-static-variables-in-c
'IT' 카테고리의 다른 글
WebForms 중단 없는 유효성 검사 모드에 jquery용 ScriptResourceMapping이 필요함 (0) | 2023.06.22 |
---|---|
클라우드 함수에서 Google Cloud SQL을 연결하는 방법은 무엇입니까? (0) | 2023.06.17 |
Oracle에서 개체의 소유자를 어떻게 찾을 수 있습니까? (0) | 2023.06.17 |
bash 스크립트에서 테이블 mariadb 업데이트 (0) | 2023.06.17 |
Angular 2 이상 변수 업데이트/액세스가 완료될 때까지 구독 대기 (0) | 2023.06.17 |