¿El entero no inicializado siempre está predeterminado a 0 en c?

Estoy leyendo el código fuente de nginx y descubro que no está inicializando muchas de las variables numéricas, incluido ngx_int_t ngx_last_process; , aquí ngx_int_t definido como long int

 #if 0 ngx_last_process = 0; #endif 

Entonces, ¿aquí @Igor Sysoev cree que es innecesario hacer la inicialización?

Pero en el progtwig se asume que el valor predeterminado es 0 :

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

¿Está garantizado que la variable no inicializada tendrá valor 0 en c en absoluto?

Las variables externas y estáticas se inicializan a cero de manera predeterminada, esto está garantizado. Las variables automáticas y de registro que no tienen un inicializador explícito tendrán un valor indeterminado (ya sea un valor no especificado o una representación de captura).

Desde el estándar:

C89

6.5.7:

Si un objeto que tiene una duración de almacenamiento estática no se inicializa de manera explícita, se inicializa implícitamente como si cada miembro que tiene un tipo aritmético tuviera 0 asignado y a cada miembro que tenga tipo de puntero se le asignara una constante de puntero nulo. Si un objeto que tiene una duración de almacenamiento automática no se inicializa explícitamente, su valor es indeterminado.

C99

6.2.4, §5:

Para un objeto que no tiene un tipo de matriz de longitud variable, su duración se extiende desde la entrada en el bloque con el que está asociado hasta que la ejecución de ese bloque termina de todos modos. (Entrando en un bloque cerrado o llamando a una función se suspende, pero no fin, ejecución del bloque actual.) Si el bloque se ingresa recursivamente, se crea una nueva instancia del objeto cada vez. El valor inicial del objeto es indeterminado. Si se especifica una inicialización para el objeto, se realiza cada vez que se alcanza la statement en la ejecución del bloque; de lo contrario, el valor se vuelve indeterminado cada vez que se alcanza la statement.

6.7.8, §10:

Si un objeto que tiene una duración de almacenamiento automática no se inicializa explícitamente, su valor es indeterminado. Si un objeto que tiene una duración de almacenamiento estática no se inicializa explícitamente, entonces:

– si tiene tipo de puntero, se inicializa a un puntero nulo;

– si tiene tipo aritmético, se inicializa a cero (positivo o mal firmado);

– si es un agregado, cada miembro se inicializa (recursivamente) de acuerdo con estas reglas;

– si es una unión, el primer miembro nombrado se inicializa (recursivamente) de acuerdo con estas reglas.

3.17.2, §1:

valor indeterminado: un valor no especificado o una representación de trampa

3.17.3, §1:

valor no especificado: valor válido del tipo relevante donde esta Norma Internacional no impone requisitos sobre qué valor se elige en ningún caso. NOTA Un valor no especificado no puede ser una representación de trampa.

las variables automatic (locales) no garantizan que sean cero, pueden contener basura.

se garantiza que global variables global y las variables static sean cero.

Las variables declaradas (como int ) en el scope del archivo se inicializan a 0.

Ejemplo

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

¿Está garantizado que la variable no inicializada tendrá valor 0 en c en absoluto?

¡Nopes! Eso no es válido para las variables declaradas en el scope de la función.

Depende de cómo se asigna la variable. Las variables asignadas estáticamente se inicializan a cero, mientras que las variables asignadas en la stack o con malloc() no lo son.