Как я могу инициализировать массив указателей на структуры? - PullRequest
15 голосов
/ 12 октября 2008

Можно ли инициализировать массив указателей на структуры? Что-то вроде:

struct country_t *countries[] = {
        {"United States of America", "America"},
        {"England", "Europe"},
        {"Ethiopia", "Africa"}  
    }

Я хочу сделать это, чтобы получить объекты в несмежной памяти и указатели на них в смежной памяти ... Но я не могу использовать динамическую память, поэтому мне интересно, возможно ли это без нее.

Ответы [ 2 ]

30 голосов
/ 12 октября 2008

Ну, ваш код использует структуры, а не указатели на структуры. Есть способы сделать то, что вы ищете, в том числе:

static struct country_t us = { "United States of America", "America" };
static struct country_t uk = { "England",                  "Europe"  };
static struct country_t et = { "Ethiopia",                 "Africa"  };

struct country_t *countries[] = { &us, &uk, &et, };

Есть другие способы сделать это с помощью назначенных инициализаторов и составных литералов в C99. Раздел 6.5.2.5 «Составные литералы» показывает путь:

struct country_t *countries[] =
{
    &(struct country_t) { "United States of America", "America" },
    &(struct country_t) { "England",                  "Europe"  },
    &(struct country_t) { "Ethiopia",                 "Africa"  },
};

Стандарт иллюстрирует указатели на структуры с вызовом функции. Имейте в виду, что не все компиляторы C принимают синтаксис C99, и эти составные литералы не присутствовали в C89 (он же C90).

Редактировать: Обновлен для использования двухбуквенных кодов стран ISO 3166. Также преобразовал именованные структуры в статические переменные - эти символы раньше не были видны вне файла (потому что они не существовали), а теперь они не видны и вне файла. Я подумал, стоит ли делать что-нибудь const, и решил не делать этого, но использование const, когда это возможно, - хорошая идея. Также, в примере, есть 3 страны на 3 континентах. Если бы у вас было несколько стран на одном континенте (норма), вы могли бы захотеть разделить строки континента. Однако то, можете ли вы сделать это безопасно (или вообще), зависит от деталей struct country_t (которые не были указаны) и от того, разрешено ли программе обновлять таблицу (что возвращает к вопросу о постоянстве ).

0 голосов
/ 12 октября 2008

Это работает для меня:


struct country_t {
    char *fullname;
    char *shortname;
};

struct country_t countries[] = {
        {"United States of America", "America"},
        {"England", "Europe"},
        {"Ethiopia", "Africa"}
};

int main(int argc, char *argv[])
{
    return 0;
}

Вы можете быть более кратким и использовать:


struct country_t {
    char *fullname;
    char *shortname;
} countries[] = {
        {"United States of America", "America"},
        {"England", "Europe"},
        {"Ethiopia", "Africa"}
};

int main(int argc, char *argv[])
{
    return 0;
}

Редактировать: Я нашел эту информацию в The C Book

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