0
votes

C ++ La répartition statique des littéraux de chaîne s'applique à n'importe quel Const Char *

dans STROSTRUP C ++ 4thed p176, il déclare que ce code est en sécurité car les littéraux de chaîne sont alloués statiquement xxx

J'ai deux questions à ce sujet:

Premier, à Quelle révision de C ++ est-elle devenue le cas? (et est-ce que la mise en œuvre est-elle dépendante?)

Deuxièmement, cela s'étend-il à tout "const char *"? Sur cette deuxième partie, je suppose que la réponse est non, car cela a provoqué une erreur de temps d'exécution: xxx


0 commentaires

3 Réponses :


1
votes

Premier, à quelle révision de C ++ est-elle devenue le cas?

a toujours été le cas car c ++ était normalisé. Les littéraux de chaîne ont statique Durée de stockage .

seconde, est-ce que cela s'étend à n'importe quel "const char *"?

Oui, si l'objet renvoyé a stockage statique. Mais ce n'est pas le cas dans votre exemple. res a une durée de stockage automatique. Au lieu de cela, vous pouvez faire: xxx

et c'est valide.


1 commentaires

"Toujours été le cas puisque C ++ a été normalisé." et aussi longtemps avant cela.



0
votes

Pour renvoyer une référence ou un pointeur sur une variable avec la durée de stockage automatique à partir d'une fonction invoque un comportement non défini car après avoir quitté la fonction de la variable référencée ou pointue ne sera pas en vie.

Les littéraux de chaîne ont une durée de stockage statique pour que vous Peut renvoyer un pointeur ou une référence à un littéral à chaîne. P>

Vous pouvez également renvoyer une référence ou un pointeur à une variable locale de fonction déclarée avec le spécificateur de stockage statique. p>

Par exemple, à l'aide de cette fonction de fonction p> xxx pré>

Cet extrait de code p> xxx pré>

invoque le comportement indéfini car La chaîne pointue stockée dans le tableau res code> avec la durée de stockage automatique ne sera pas en vie. p>

Toutefois, si la fonction sera définie comme suit p> xxx PRE>

Puis ce code SNIPPET P>

hello World
12


0 commentaires

0
votes

La déclaration fait référence aux littéraux à ne pas faire de Const Char *, vous devez avoir l'esprit la différence entre un Cons-Char * et un littéral. La première ligne de code que vous avez mentionné:

const char* make_const_char_ptr(){ 
    const static char res [] = {'a','b','c', '\0' }; 
    return res; 
}


0 commentaires