Inicializando una matriz después de la statement

gcc 4.4.3 c89

Tengo el siguiente código como muestra de lo que estoy tratando de hacer. No sé el tamaño real de la matriz, hasta que entro en la función. Sin embargo, no creo que pueda establecer el tamaño del arreglo después de haberlo declarado. Lo necesito globalmente ya que algunas otras funciones necesitarán acceder a los nombres de dispositivos.

Muchas gracias por las sugerencias,

/* global */ char *devices_names[]; void fill_devices(size_t num_devices) { devices_names[num_devices]; /* start filling */ } 

Deberá asignar la memoria dinámicamente usando malloc:

 char **device_names; void fill_devices(size_t num_devices) { device_names = malloc(num_devices * sizeof(char*)); } 

Y luego usar free(device_names); para liberar la memoria cuando ya no la necesites.

Hazlo dynamic:

 char **g_device_names; int g_num_devices; void fill_devices(size_t num_devices) { g_device_names = malloc(sizeof(char*) * num_devices); g_num_devices = num_devices; ... } 

Si está utilizando una matriz global, necesita saber su tamaño (o su tamaño máximo) en el momento en que lo declara. P.ej

 char *devices_names[MAX_DEVICES]; 

Si no puede hacer esto, entonces no tiene más remedio que usar un puntero y una memoria asignada dinámicamente.

P.ej

 char **devices_names = 0; void fill_devices(size_t num_devices) { devices_names = malloc( num_devices * sizeof *devices_names ); /* ... */ } 

Por supuesto, esto tiene implicaciones, por ejemplo, ¿cómo evita que las personas accedan a la matriz antes de que haya sido asignada y cuándo la libera?

Debe usar un puntero, de modo que cuando ingrese el método, la matriz aún no está declarada. Puede utilizar malloc para establecer el tamaño correcto. Mira este artículo: arrays y malloc.