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 J'ai deux questions à ce sujet: p> Premier, à Quelle révision de C ++ est-elle devenue le cas? (et est-ce que la mise en œuvre est-elle dépendante?) P> 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: p>
3 Réponses :
Premier, à quelle révision de C ++ est-elle devenue le cas? p>
a toujours été le cas car c ++ était normalisé. Les littéraux de chaîne ont statique Durée de stockage . P>
seconde, est-ce que cela s'étend à n'importe quel "const char *"? p> blockQuote>
Oui, si l'objet renvoyé a stockage statique. Mais ce n'est pas le cas dans votre exemple.
res code> a une durée de stockage automatique. Au lieu de cela, vous pouvez faire: p>
xxx pré> et c'est valide. P> blockquote>
"Toujours été le cas puisque C ++ a été normalisé." et aussi longtemps avant cela.
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> Cet extrait de code p> invoque le comportement indéfini car La chaîne pointue stockée dans le tableau Toutefois, si la fonction sera définie comme suit p> Puis ce code SNIPPET P> res code> avec la durée de stockage automatique ne sera pas en vie. p>
hello World
12
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; }