7
votes

Quand C ++ alloue / distribuer des littéraux de chaîne

Quand est le littéral de chaîne "Hello" alloué et distribué pendant la durée de vie du programme dans cet exemple?

init(char **s)
{ 
  *s = "hello";
}
int f()
{
  char *s = 0;
  init(&s);
  printf("%s\n", s);
  return 0;
}


3 commentaires

Code indent par quatre espaces. N'utilisez pas les balises .


Comment inclure des segments de code dans le poteau puis sans utiliser de tags de code? pls donner exemple


Modifiez votre message. Vous verrez les modifications que j'ai faites. Fondamentalement, le code est juste procédé par ligne vide et en retrait par quatre espaces.


3 Réponses :


3
votes

Ils ne sont pas alloués, mais plutôt stockés dans le segment de données de l'exécutable.


1 commentaires

Les langages FYI, C et C ++ n'ont pas besoin de segment data . La spécification indique que les littéraux de chaîne sont des constantes, mais laisse leur espace de stockage jusqu'au traducteur.



16
votes

Le littéral à chaîne est initialisé dans le segment de mémoire en lecture seule par le compilateur. Il n'y a pas d'initialisation ou d'enlèvement effectué au moment de l'exécution.


4 commentaires

Le compilateur peut copier le contenu de la chaîne littéral dans stockage local (la pile), il y a donc une certaine initialisation. Pour éviter cela, je déclare des variables comme Const Statique Char Texte [] = "Bonjour"; . En outre, le segment en lecture seule peut également être le segment exécutable.


Les littéraux à chaîne pourraient être en lecture seule, mais qui dépend du compilateur. Donc, la modification d'un littéral à chaîne, comme dans le code dans la question, a un comportement indéfini, mais cela pourrait fonctionner.


@Thomas. Je ne crois pas que tout compilateur copierait la chaîne sur la pile qui semble plutôt une opération redondante.


@Thams, @David: Oui Le compilateur peut choisir de ne pas utiliser de segment en lecture seule (comme indiqué un détail de mise en œuvre). Mais à partir du point de vue des programmeurs, vous devez toujours le considérer comme une lecture seule, car le type est en réalité «Char Cons *» et n'est converti que vers 'Char *' pour la compatibilité rédaction avec C, et comme indiqué toute modification est un comportement indéfini.



1
votes

En supposant qu'il y ait un système d'exploitation, la mémoire contenant le littéral à chaîne est allouée lorsque le système d'exploitation charge l'exécutable et traçalisé lorsque l'OS décharge l'exécutable. Exactement, lorsque cela se produit dépend du type d'exécutable (programme, bibliothèque partagée, etc.) et le système d'exploitation.


0 commentaires