En C existen varios métodos para inicializar estructuras:
struct Point { int x, y; }; struct Point p = {10, 20};
Los campos se inicializan en el orden declarado.
struct Point p = {.y = 20, .x = 10};
Se pueden inicializar los campos en cualquier orden.
struct Rect { int x, y, w, h; } r = {1, 2}; // w y h == 0
struct Color { int r, g, b; }; struct Pixel { struct Point pos; struct Color col; }; struct Pixel px = {{10,20}, {255,0,0}};
La inicialización por nombre ayuda a evitar errores:
struct Pixel px = {.col = {.r = 255, .g = 0, .b = 0}};
Problemas:
Pregunta: ¿Qué pasará si al inicializar una estructura no se especifican explícitamente todos los campos y la estructura se declara como una variable local automática?
Respuesta incorrecta esperada: "Los campos restantes siempre serán iguales a cero."
Respuesta correcta: Las variables automáticas (locales) que no se inicializan explícitamente permanecen con valores no inicializados. La inicialización parcial inicializa únicamente los campos que se especifican explícitamente; los demás tendrán valores indefinidos (excepto en inicialización a través de = {...}, donde los restantes serán cero solo para estructuras estáticas/globales).
Ejemplo:
void foo() { struct Point { int x, y, z; } p = {1}; // p.x == 1, p.y y p.z == 0 (Solo a través de = {1};) }
Historia
En un proyecto de motor gráfico, se agregó un campo al inicio de la estructura de vértice sin revisar el método general de inicialización de objetos en diferentes módulos. Como resultado, la mitad de los módulos empezaron a inicializar incorrectamente el color o las coordenadas, lo que se manifestó como artefactos de visualización.
Historia
En un controlador de video, una estructura con punteros anidados fue parcialmente inicializada = {0}, lo que es correcto para variables globales, pero no para locales. Como resultado, los punteros contenían "basura", lo que llevó a trabajar con direcciones inválidas y fallos difíciles de atrapar.
Historia
Al agregar nuevos campos a una gran estructura, los autores no actualizaron las viejas secciones de código con inicialización por orden. Debido a la discrepancia en el orden de los campos y los inicializadores, las variables críticas empezaron a recibir valores incorrectos. Solo una auditoría de la estructura y la implementación de la inicialización por nombre ayudaron a encontrar la causa.