Инициализация массива после объявления - PullRequest
1 голос
/ 12 мая 2010

gcc 4.4.3 c89

У меня есть следующий код в качестве примера того, что я пытаюсь сделать. Я не знаю фактический размер массива, пока я не войду в функцию. Однако я не думаю, что смогу установить размер массива после того, как объявил его. Мне нужно, чтобы он был глобальным, так как некоторым другим функциям потребуется доступ к именам устройств.

Большое спасибо за любые предложения,

/* global */
char *devices_names[];

void fill_devices(size_t num_devices)
{
    devices_names[num_devices];

    /* start filling */
}

Ответы [ 4 ]

3 голосов
/ 12 мая 2010

Если вы используете глобальный массив, вам нужно знать его размер (или его максимальный размер) во время его объявления. Э.Г.

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 );

    /* ... */
}

Конечно, это имеет значение, например, как вам запретить доступ людей к массиву до его выделения и когда вы его освобождаете?

3 голосов
/ 12 мая 2010

Сделайте это динамическим:

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;
    ...
}
2 голосов
/ 12 мая 2010

Вы должны использовать указатель, поэтому при вводе метода массив все еще не объявлен. Вы можете использовать malloc, чтобы установить правильный размер. Посмотрите на эту статью: массивы и malloc

2 голосов
/ 12 мая 2010

Вам нужно будет динамически распределять память, используя malloc:

char **device_names;

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

А затем используйте free(device_names);, чтобы освободить память, когда она вам больше не нужна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...