2017-10-22 19 views
0

구조체 배열이 있습니다. 일부 인덱스 위치 만 초기화해야합니다. 초기화되지 않은 조합이 init'd가 0이되도록 보장하는 컴파일러 속성이 있습니까?전역 초기화 된 배열의 사용되지 않은 색인?

: I는 다음과 같이 정적 init'd 구조체 배열이 있다면

이 어떻게 (명시-init'd 사전되지 않음)이 어레이의 나머지 3 개 요소 제로 "되도록 할 수 있습니다 꺼내?

typedef struct foo_s { 
    int a; 
    int b; 
} foo_t; 

foo_t foo_array[4] = { 
    { .a = 1, .b = 2 }, 
}; 

감사합니다,

+4

명시 적으로 초기화되지 않은 것은 "0"으로 초기화됩니다. 그것은 C 언어의 일부입니다. –

답변

1

당신이 원하는 행동에는 "반 초기화"변수가 없습니다 이미 표준 C의 일부이다; 만약 당신이 무언가의 일부만을 초기화한다면, 남아있는 모든 원소들은 제로 - 초기화 될 것입니다.

게다가이 배열이 전역이라는 것을 (귀하의 제목에서) 말합니다. 즉, 정적 저장 기간이 있으므로 초기화 프로그램을 전혀 제공하지 않더라도 0으로 초기화됩니다.

6.7.8/19 : 골재 초기화에 C99을 인용

[...]이 내재적 오브젝트와 동일한 초기화한다 초기화 명시되지 않은 모든 하위 개체 정적 저장 기간.

6.7.8/21 :

문자가 사용되는 문자열 요소 또는 집합의 구성원 자 이하가보다 중괄호로 둘러싸인 목록에 적은 이니셜 라이저가있는 경우 배열에있는 요소보다 알려진 크기의 배열을 초기화하면 집계의 나머지 부분은 정적 저장 기간이있는 객체와 암시 적으로 초기화됩니다.

6.7.8/10 :

정적 저장 기간을 가진 개체를 명시 적으로 초기화되지 않은 경우, 다음 :가 포인터 타입이있는 경우

  • 는 그것이 널 포인터로 초기화된다.
  • 산술 형식 인 경우 (양수 또는 부호가없는) 0으로 초기화됩니다.
  • 집계 인 경우 모든 구성원은이 규칙에 따라 (재귀 적으로) 초기화됩니다.
  • 공용체 인 경우 첫 번째 명명 된 멤버는 이러한 규칙에 따라 (재귀 적으로) 초기화됩니다.