En el lenguaje C, las variables se inicializan de manera diferente dependiendo del especificador de almacenamiento:
Ejemplo de diferencias:
void example() { int a; // automática, no inicializada static int b; // inicializada a 0 printf("a=%d, b=%d ", a, b); } int c; // global, inicializada a 0
Los errores surgen de la suposición incorrecta sobre la inicialización. Para mayor seguridad, siempre inicializa las variables explícitamente.
¿Se inicializa una variable local automática con el valor 0 si se declara a nivel de función fuera de un bloque?
Respuesta:
¡No! Incluso si la variable se declara al comienzo de la función pero sin inicialización explícita, contendrá basura:
void f() { int x; printf("%d ", x); // UB: x no está inicializada }
Historia
En un software bancario, la falta de inicialización de un contador dentro de una función llevó a que a veces tuviera un gran número negativo, el resultado: se otorgaban bonificaciones erróneas al cliente, el error solo se descubrió con datos reales.
Historia
Un procesador multimedia de imágenes asumía al inicio que los arreglos estáticos siempre estaban llenos de ceros. Después de cambiar a otro compilador (con un entorno no estándar), se descubrió un segfault: parte de la memoria no se había asignado físicamente al proceso.
Historia
En una biblioteca criptográfica, el desarrollador no inicializó un búfer temporal para contraseñas, asumiendo que el búfer de la sección global estaba lleno de ceros, pero ocurrió un incidente con la memoria donde quedaron viejos datos sensibles. Esto llevó a una filtración de contraseñas durante un volcado.