173 votes

Littéraux de chaîne C : où vont-ils ?

J'ai lu beaucoup de posts sur "les littéraux de chaîne", dont la plupart ont été sur les meilleures pratiques, ou lorsque la traduction littérale n'est PAS situé dans la mémoire.

Je suis intéressé par où la chaîne est attribuée ou stockées, etc.

Je n'ai trouver un intrigant réponse ici, en disant:

Définition d'une chaîne inline effectivement intègre les données dans le programme lui-même et ne peut pas être modifié (certains compilateurs permettent à ce par un smart truc, ne vous inquiétez pas).

mais, qu'il avait à faire avec le C++, pour ne pas mentionner qu'il est dit de ne pas déranger.

Je suis déranger. =D

Donc ma question est, encore une fois, où et comment est ma chaîne de caractères littérale? Pourquoi devrais-je pas essayer de le modifier? La mise en œuvre varient selon la plate-forme? Personne ne s'en soucie de donner des précisions sur les "smart truc?"

Merci pour toutes les explications.

133voto

R Samuel Klatchko Points 44549

Une technique courante est de littéraux de chaîne pour être mis en "lecture seule-données" qui est projeté dans l'espace de processus en lecture seule (c'est pourquoi vous ne pouvez pas le modifier).

Il varie selon la plate-forme. Par exemple, plus simple puce architectures peuvent pas en charge la lecture seule des segments de mémoire de sorte que le segment de données sera accessible en écriture.

Plutôt que d'essayer de trouver un truc pour faire des littéraux de chaîne variable (cela dépendra fortement de votre plate-forme et peuvent changer au fil du temps), il suffit d'utiliser des tableaux:

char foo[] = "...";

Le compilateur s'arranger pour que la matrice de l'initialisation de la littéralité et vous pouvez modifier le tableau.

57voto

Jerry Coffin Points 237758

Il n'y a pas de réponse unique à cette question. Le C et le C++ normes de dire que les littéraux de chaîne ont statique de la durée de stockage, toute tentative de modification donne un comportement indéfini, et plusieurs littéraux de chaîne avec le même contenu peut ou peut ne pas partager le même stockage.

Selon le système que vous êtes en train de rédiger, et les capacités de l'exécutable format de fichier, il utilise, ils peuvent être stockées avec le code du programme dans le segment de texte, ou ils peuvent avoir un segment distinct pour les données initialisées.

Déterminer les détails varient en fonction de la plate-forme -- très probablement inclure des outils qui peuvent vous dire où c'est de le mettre. Certains vont même vous donner le contrôle sur des détails comme ça, si vous le souhaitez (par exemple, gnu ld permet de fournir un script pour tout dire sur la façon de groupe de données, code, etc.)

23voto

Justicle Points 6439

Pour info, soutenir les autres réponses:

Le standard: ISO/IEC 14882:2003 dit:

2.13. Les littéraux de chaîne

  1. [...]Une chaîne ordinaire littéral de type "tableau de n const char" et statique de la durée de stockage (3.7)

  2. Si tous les littéraux de chaîne sont distincts (c'est-à, sont stockées dans ne se chevauchent pas les objets) est la mise en œuvre définies. L'effet de la tentative de modifier une chaîne de caractères littérale n'est pas défini.

15voto

Alex Budovski Points 8932

GCC fait un `` section qui obtient le mappage « quelque part » dans l’espace d’adressage et est marquée lecture seulement,

Visual C++ ( ) fait un article dans le même but.

Vous pouvez regarder la sortie de ou (sous Linux) pour voir les sections de votre fichier exécutable.

Par exemple

4voto

Parappa Points 4835

Elle dépend du format de votre exécutable. Une façon de penser est que si vous étiez Assemblée de programmation, vous risquez de mettre des littéraux de chaîne dans le segment de données de votre programme de l’Assemblée. Votre compilateur C est quelque chose comme ça, mais ça dépend sur quel système vous êtes binaire compilé pour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X