Если вы используете глобальный массив, вам нужно знать его размер (или его максимальный размер) во время его объявления. Э.Г.
char *devices_names[MAX_DEVICES];
Если вы не можете сделать это, у вас нет другого выбора, кроме как использовать указатель и динамически распределенную память.
* 1006 Е.Г. *
char **devices_names = 0;
void fill_devices(size_t num_devices)
{
devices_names = malloc( num_devices * sizeof *devices_names );
/* ... */
}
Конечно, это имеет значение, например, как вам запретить доступ людей к массиву до его выделения и когда вы его освобождаете?