2010-05-05 6 views
5

L'initialisation du tableau est-elle correcte? Je suppose que c'est, mais je ne suis pas vraiment sûr si je peux utiliser const char* ou si je ferais mieux d'utiliser std::string. À côté de la première question, est-ce que les pointeurs char pointent vers des segments de mémoire de même taille?Initialisation du tableau de structure et littéraux de chaîne

struct qinfo 
{ 
    const char* name; 
    int nr; 
}; 
qinfo queues[] = { 
    {"QALARM", 1}, 
    {"QTESTLONGNAME", 2}, 
    {"QTEST2", 3}, 
    {"QIEC", 4} 
}; 
+1

Je voudrais juste rester à 'char const *'. Il vaut mieux ne pas passer à 'std :: string' pour cela, sauf si vous voulez souffrir de l'ordre d'initialisation statique fiasco. –

Répondre

2

Oui, cela semble bien. Évidemment, vous ne pourrez pas modifier les chaînes de noms par la suite (bien que vous puissiez changer les pointeurs pour pointer sur des chaînes différentes si nécessaire). Le stockage pour chacune des chaînes de const sera seulement autant que nécessaire et sera généralement en lecture seule.

2

Attend fines, les tailles de mémoire pour les chaînes seront différentes sous forme de tableaux de char * initialisés comme qui seront alloués différentes tailles. Le compilateur allouera juste assez d'espaces pour contenir les caractères puis un "\ 0" supplémentaire pour terminer la chaîne.

+0

@ markh44 Juste point, édité la réponse. – shuttle87

1

C'est correct car les littéraux de chaîne ont une durée de stockage statique. Dans ce cas, inutile d'utiliser std::string car cela impliquera une allocation dynamique de la mémoire lors de l'exécution.

2

L'initialisation est correcte mais le char * pointera vers des blocs de mémoire de taille différente car ils doivent contenir des chaînes de longueurs différentes. Pour votre autre question, si vous voulez vous assurer que la chaîne pointée par le membre struct reste la même après l'initialisation, vous devez utiliser const std :: string (j'ignore ici les hacks cast). Pour faire la même chose que vous avec un pointeur char, vous devez déclarer comme

const char* const 

dire à la fois le pointeur de la valeur et la valeur pointée sont const.

0

Votre code est correct, mais les chaînes seront dans différentes quantités de mémoire, ce qui peut être en lecture seule.

Pour répondre à la question rhétorique, un ajustement mineur à la struct permettra la modification des chaînes et fixer la mise en page de mémoire (toujours spécifique à la plateforme, bien sûr) bien:

struct qinfo 
{ 
    char name[50]; // string lives inside the struct 
    int nr; 
}; 
qinfo queues[] = { 
    {"QALARM", 1}, // the literals are used to initialize the char array 
    {"QTESTLONGNAME", 2}, // they should not be otherwise 
    {"QTEST2", 3},  // compiled into the program 
    {"QIEC", 4} 
}; 
0

il semble ok pour moi . Je ne vois rien de mal.

Questions connexes