2008-10-11 22 views
15

Est-il possible d'initialiser un tableau de pointeurs sur des structures? Quelque chose comme:Comment initialiser un tableau de pointeurs sur des structures?

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

Je veux le faire afin d'obtenir les entités dans la mémoire non contiguës, et les pointeurs vers eux dans la mémoire contiguë ... Mais je ne peux pas utiliser la mémoire dynamique, donc je Je me demande si c'est possible sans cela.

Répondre

30

Eh bien, votre code utilise des structures plutôt que des pointeurs vers des structures. Il y a plusieurs façons de faire ce que vous cherchez, y compris:

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

Il existe d'autres façons de le faire avec littéraux initialiseurs désignés et composés dans C99. Section 6.5.2.5 'Compound Literals' montre la voie:

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

La norme illustre des pointeurs vers des structures avec un appel de fonction. Soyez conscient que tous les compilateurs C n'acceptent pas la syntaxe C99, et ces littéraux composés n'étaient pas présents dans C89 (alias C90).

Édition: Mise à niveau pour utiliser les codes pays ISO 3166 à deux lettres. Fait également les structures nommées dans des variables statiques - ces symboles n'étaient pas visibles en dehors du fichier avant (parce qu'ils n'existaient pas), et maintenant ils ne sont pas visibles en dehors du fichier après, non plus. J'ai débattu de la possibilité de faire quelque chose de const et j'ai décidé de ne pas le faire - mais utiliser const quand vous le pouvez est généralement une bonne idée. En outre, dans l'exemple, il y a 3 pays sur 3 continents. Si vous aviez plusieurs pays sur un même continent (la norme), vous pourriez vouloir partager les chaînes du continent. Cependant, si vous pouvez le faire en toute sécurité (ou pas du tout) dépend des détails du struct country_t (qui n'ont pas été donnés), et si le programme est autorisé à mettre à jour la table (ce qui revient à la question de constance).

+1

Dans votre premier exemple, vous devrait marquer toutes les structures comme 'static': elles ne devraient pas avoir besoin d'être visibles en dehors de l'unité de compilation actuelle, et encombrent les liens espace de noms maintenant. – ephemient

+0

D'accord - J'ai décidé de ne pas compliquer la réponse avec ce détail, même si je codais la solution pour mon propre travail, tout ce qui pourrait être statique (invisible en dehors du fichier) serait. –

0

Cela fonctionne pour moi:


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

Vous pourriez être plus laconique et l'utilisation:


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: J'ai trouvé ces informations à The C Book

+2

La question demande un tableau de pointeurs vers les structures, ce qui signifie que votre réponse manque le point, n'est-ce pas? –

+2

En outre, * Europe * est le nom abrégé de * England *? Nooooo waaay! :-) – Jens