Hvordan kan jeg initialisere en rekke pekere til structs?

stemmer
15

Er det mulig å initialisere en rekke pekere til structs? Noe som:

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

Jeg ønsker å gjøre det for å få enhetene i ikke-sammenhengende minne, og pekere til dem i sammenhengende minne ... Men jeg kan ikke bruke dynamisk minne, så jeg lurer på om det er mulig uten det.

Publisert på 11/10/2008 klokken 23:31
kilden bruker
På andre språk...                            


2 svar

stemmer
30

Vel, bruker koden strukturer heller enn pekere til strukturer. Det finnes måter å gjøre det du søker, inkludert:

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, };

Det finnes andre måter å gjøre det med utpekte initializers og sammensatte litteraler i C99. Seksjon 6.5.2.5 'Sammensatte Literaler' viser vei:

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

Standarden viser pekere til strukturer med et funksjonskall. Vær oppmerksom på at ikke alle C-kompilatorer aksepterer C99 syntaks, og disse sammensatte litteraler ikke var til stede i C89 (aka C90).

Edit: Oppgradert å bruke to-brev ISO 3166 landskoder. Også gjort de navngitte strukturene i statiske variabler - disse symbolene var ikke synlig utenfor filen før (fordi de ikke finnes), og nå er de ikke synlige utenfor filen etter, heller. Jeg diskutert om å gjøre noe const og besluttet å ikke - men å bruke const når du kan er vanligvis en god idé. Også i eksempelet er det 3 land i 3 kontinenter. Ble du å ha flere land i én verdensdel (normen), vil du kanskje kunne dele kontinentet strenger. Men om du kan gjøre det trygt (eller i det hele tatt) er avhengig av detaljene i struct country_t(som ikke ble gitt), og om programmet er lov til å oppdatere tabellen (som kommer tilbake til const-ness spørsmålet).

Svarte 11/10/2008 kl. 23:39
kilden bruker

stemmer
0

Dette fungerer for meg:


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

Du kan være mer avvisende og bruk:


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

Edit: Jeg fant denne informasjonen på C Book

Svarte 11/10/2008 kl. 23:45
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more