inicialización de matriz de estructura c

Tengo estructura

struct ABC { int a; int b; } 

y matriz de ella como

 struct ABC xyz[100]; 

Quiero inicializarlo a = 10 yb = 20; para todo el elemento de la matriz.

¿Cuál es la mejor manera?

Si bien no hay una manera particularmente elegante de inicializar una gran matriz como esta en C, es posible. No tiene que hacerlo en tiempo de ejecución, como falsamente afirman algunas respuestas. Y no quiere hacerlo en tiempo de ejecución, supongamos que la matriz es const ?

La forma en que lo hago es definiendo un número de macros:

 struct ABC { int a; int b; }; #define ABC_INIT_100 ABC_INIT_50 ABC_INIT_50 #define ABC_INIT_50 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 #define ABC_INIT_10 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 #define ABC_INIT_2 ABC_INIT_1 ABC_INIT_1 #define ABC_INIT_1 {10, 20}, int main() { struct ABC xyz[100] = { ABC_INIT_100 }; } 

Tenga en cuenta que las macros como estas se pueden combinar de cualquier manera, para hacer cualquier cantidad de inicializaciones. Por ejemplo:

 #define ABC_INIT_152 ABC_INIT_100 ABC_INIT_50 ABC_INIT_2 

Con GCC puede usar su syntax extendida y hacer:

 struct ABC xyz[100] = { [0 ... 99].a = 10, [0 ... 99].b = 20 }; 

Para una solución portátil, probablemente inicialice una instancia y use un bucle para copiar esa instancia al rest:

 struct ABC xyz[100] = { [0].a = 10, [0].b = 20 }; for(size_t i = 1; i < sizeof xyz / sizeof *xyz; ++i) xyz[i] = xyz[0]; 

Esto es algo más limpio para mí que tener los valores reales en el bucle. Se puede decir que expresa el resultado deseado en un nivel ligeramente superior .

La syntax anterior ( [0].a y [0].b ) no es una extensión, es típico C99.

 for(unsigned int i=0; i<100; i++) { xyz[i].a = 10; xyz[i].b = 20; } 

No hay soporte de lenguaje explícito para inicializar todos los elementos en una matriz de subestructuras a valores predeterminados específicos distintos de cero, en la forma en que hay para inicializar todos los elementos a cero; o bien debe inicializar cada elemento de forma explícita en el origen en tiempo de comstackción o debe escribir un bucle for () e inicializar cada elemento al inicio.

Como señala el usuario @lundin en otra respuesta, puede usar macros de preprocesador para reducir el tipado involucrado en la inicialización explícita de esos valores, pero en lo que respecta al comstackdor de C, aún está inicializando cada elemento de forma explícita.