O inteiro não inicializado é sempre padrão para 0 em c?

Estou lendo o código-fonte do nginx e descubro que ele não está inicializando muitas das variables ​​numéricas, incluindo ngx_int_t ngx_last_process; , aqui ngx_int_t definido como long int

 #if 0 ngx_last_process = 0; #endif 

Então, aqui @Igor Sysoev acha desnecessário fazer a boot?

Mas no programe está assumindo que o valor padrão é 0 :

  for (s = 0; s < ngx_last_process; s++) { if (ngx_processes[s].pid == -1) { break; } } 

É garantido que a variável não inicializada terá 0 valor em c?

Variáveis externas e estáticas são inicializadas como zero por padrão, isso é garantido. As variables automáticas e de registro que não possuem um inicializador explícito terão um valor indeterminado (um valor não especificado ou uma representação de trapping).

Do padrão:

C89

6.5.7:

Se um object que tem duração de armazenamento estático não for inicializado explicitamente, ele será inicializado implicitamente como se todos os membros que tivessem tipo aritmético fossem atribuídos a 0 e cada membro que tivesse o tipo de ponteiro fosse atribuído a uma constante de ponteiro nulo. Se um object que possui duração de armazenamento automático não for inicializado explicitamente, seu valor será indeterminado.

C99

6.2.4, §5:

Para um object como esse que não possui um tipo de matriz de comprimento variável, seu tempo de vida se estende desde a input no bloco ao qual ele está associado até que a execução desse bloco termine de qualquer maneira (inserir um bloco fechado ou chamar uma function suspende, mas não fim, execução do bloco atual.) Se o bloco for inserido recursivamente, uma nova instância do object é criada a cada vez. O valor inicial do object é indeterminado. Se uma boot é especificada para o object, ela é executada toda vez que a declaração é alcançada na execução do bloco; caso contrário, o valor se tornará indeterminado toda vez que a declaração for atingida.

6.7.8, §10:

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 tem 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.

3.17.2, §1:

valor indeterminado: um valor não especificado ou uma representação de trap

3.17.3, §1:

valor não especificado: valor válido do tipo relevante em que esta Norma não impõe requisitos sobre qual valor é escolhido em qualquer instância. NOTA Um valor não especificado não pode ser uma representação de trap.

variables automatic (locais) não são garantidas como zero, podem conter lixo.

variables global e variables static são garantidas como zero.

Variáveis ​​declaradas (como int ) no escopo do arquivo são inicializadas como 0.

Exemplo

 int i; int main() { int x; printf("%d",i); // prints 0 printf("%d",x); // prints some unspecified value } 

É garantido que a variável não inicializada terá 0 valor em c?

Nopes! Isso não é válido para variables ​​declaradas no escopo da function.

Depende de como a variável é alocada. As variables ​​alocadas estaticamente são inicializadas para zero, enquanto as variables ​​alocadas na pilha ou com malloc() não são.