Por supuesto, no se puede argumentar que está en los estándares C. Entonces, espere que un compilador compatible se comporte de esa manera.
La razón técnica detrás de por qué se hizo podría ser que esté enraizado en cómo funciona el código de inicio de C. Generalmente, hay varios segmentos de memoria en los que el enlazador debe poner la salida del compilador, incluidos un segmento de código (texto), un segmento de almacenamiento en bloque y un segmento variable inicializado.
Las variables de función no estáticas no tienen almacenamiento físico hasta que el alcance de la función se crea en tiempo de ejecución, por lo que el vinculador no hace nada con eso.
El código de programa va en el segmento de código (o texto) pero también lo hacen los valores utilizados para inicializar variables globales y estáticas. Las variables inicializadas (es decir, sus direcciones) van en el segmento de memoria inicializada. Las variables globales y estáticas no inicializadas entran en el segmento de almacenamiento en bloque (bss).
Cuando el programa se carga en el momento de la ejecución, una pequeña porción de código crea el entorno de tiempo de ejecución de C. En sistemas basados en ROM, copiará el valor de las variables inicializadas del segmento de código (texto) en sus respectivas direcciones reales en la RAM. Los sistemas basados en RAM (es decir, disco) pueden cargar los valores iniciales directamente en las direcciones finales de RAM.
El CRT (tiempo de ejecución de C) también pone a cero el bss que contiene todas las variables globales y estáticas que no tienen inicializadores. Esto probablemente fue hecho como una precaución contra datos no inicializados. Es una operación de relleno de bloques relativamente sencilla porque todas las variables globales y estáticas se han agrupado juntas en un segmento de dirección.
de carros de golf y dobles puede precisar un tratamiento especial debido a que su valor de 0.0 no puede ser cero todos los bits si el formato flotante no cumpla la norma IEEE 754.
Nota que desde autovariables no existen en el momento de la carga del programa ellos no pueden ser inicializados por el código de inicio del tiempo de ejecución.
Votado para volver a abrir porque esta pregunta también pregunta si algunos compiladores no ponen a cero las variables estáticas. ¡La respuesta es sí! Algunos compiladores específicos de dominio no se ajustan a todos los estándares. Por ejemplo, en TIGCC (un compilador de C para calculadoras TI-89/92/V200), se conservará una variable global con una inicialización explícita (por ejemplo, 'static int high_score = 0; ') en todas las ejecuciones del programa (a menos que esté archivado) en la memoria Flash), que proporciona una forma simple pero sórdida de conservar la configuración del programa. –