A boot de variables ​​estáticas em C

Eu tenho uma pergunta sobre a boot de variables ​​estáticas em C. Eu sei se nós declaramos uma variável estática global que, por padrão, o valor é 0 . Por exemplo:

 static int a; //although we do not initialize it, the value of a is 0 

mas e a seguinte estrutura de dados:

 typedef struct { int a; int b; int c; } Hello; static Hello hello[3]; 

são todos os membros em cada estrutura de hello[0] , hello[1] , hello[2] inicializado como 0 ?

Sim, todos os membros são inicializados para objects com armazenamento estático. Veja 6.7.8 / 10 no Padrão C99 (documento PDF)

Se um object que possui duração de armazenamento automático não for inicializado explicitamente, seu valor será indeterminado. Se um object com duração de armazenamento estático não for inicializado explicitamente , então:
– se tiver tipo de ponteiro, é inicializado para um ponteiro nulo;
– se tiver tipo aritmético, é inicializado para (positivo ou não) zero;
– se for um agregado, todo membro é inicializado (recursivamente) de acordo com essas regras;
– se for uma união, o primeiro membro nomeado é inicializado (recursivamente) de acordo com estas regras.

Para inicializar tudo em um object, seja ele static ou não, como 0, eu gosto de usar o inicializador zero universal

 sometype identifier0 = {0}; someothertype identifier1[SOMESIZE] = {0}; anytype identifier2[SIZE1][SIZE2][SIZE3] = {0}; 

Sim, variables ​​estáticas de escopo de arquivo são inicializadas para zero, incluindo todos os membros de estruturas, matrizes, etc.

Veja esta questão para referência (vou votar para fechar isso como uma duplicata também).


Edit: esta questão está recebendo respostas muito melhores, então eu estou votando para encerrar essa questão como uma duplicata disso , em vez disso.

Para referência, aqui está o link C FAQ da resposta aceita da pergunta, embora, é claro, os padrões C99 e C11 vinculados aqui sejam canônicos.

Sim, eles são, contanto que eles tenham duração de armazenamento estático ou thread.

C11 (n1570), § 6.7.9 Inicialização # 10

Se um object que tem duração estática ou de armazenamento de encadeamento não for inicializado explicitamente, então:

[…]

  • se tiver tipo aritmético, é inicializado para (positivo ou não) zero;
  • se for um agregado, todo membro é inicializado (recursivamente) de acordo com essas regras e qualquer preenchimento é inicializado com zero bits;

[…]

Gostaria de acrescentar que as variables ​​estáticas (ou matrizes) são classificadas em dois tipos.

Inicializados são aqueles que recebem valor do código em tempo de compilation. Estes são normalmente armazenados no DS, embora este seja específico do compilador.

O outro tipo é estático não inicializado que é inicializado em tempo de execução e armazenado no segmento BSS, embora novamente este seja específico do compilador.

BSS