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 Réponses :
Ils ne sont pas alloués, mais plutôt stockés dans le segment de données de l'exécutable. P>
Les langages FYI, C et C ++ n'ont pas besoin de segment data i>. La spécification indique que les littéraux de chaîne sont des constantes, mais laisse leur espace de stockage jusqu'au traducteur.
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. P>
Le compilateur peut copier le contenu de la chaîne littéral dans stockage local i> (la pile), il y a donc une certaine initialisation. Pour éviter cela, je déclare des variables comme Const Statique Char Texte [] = "Bonjour"; code>. 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.
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. P>
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.