IT

C에서 정적 변수의 초기화

itgroup 2023. 6. 17. 09:01
반응형

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 세그먼트에 저장되지만 컴파일러별로 다릅니다.

BSS

표준을 읽고 싶지 않은 사람들을 위해, 그것은 https://en.cppreference.com/w/c/language/initialization 에도 언급되어 있습니다.

암시적 초기화

이니셜라이저가 제공되지 않는 경우:

  • 자동 저장 기간이 있는 개체는 불확실한 값(트랩 표현일 수 있음)으로 초기화됩니다.
  • 정적 및 스레드 로컬 스토리지 기간이 있는 개체가 0 초기화됩니다.

언급URL : https://stackoverflow.com/questions/13251083/the-initialization-of-static-variables-in-c

반응형