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).
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
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. –