Adresse littérale de chaîne dans les unités de traduction
En C et C, les programmeurs utilisent souvent des littéraux de chaîne à diverses fins. Une question courante se pose : est-il fiable de supposer que la même chaîne littérale dans différentes unités de traduction aura la même adresse mémoire ?
Norme C/C
Le C99 et les projets de normes C laissent spécifiquement ce sujet non spécifié. La section 6.4.5 du projet de norme C99 stipule qu'« il n'est pas précisé si ces tableaux [littéraux de chaîne] sont distincts à condition que leurs éléments aient les valeurs appropriées ». Cela signifie que le compilateur est libre de décider de regrouper ou non les littéraux de chaîne.
Implémentations du compilateur
En pratique, différents compilateurs ont des comportements différents concernant le regroupement de littéraux de chaîne.
Raison d'être du manque d'exigence
La justification de ne pas exiger que les littéraux de chaîne soient regroupés dans la norme C est dû à la diversité des compilateurs et des environnements d'exécution à l'époque. Certaines implémentations stockaient les chaînes littérales dans la ROM, tandis que d'autres les stockaient dans des sections de données inscriptibles. Pour garantir la portabilité, il a été jugé préférable de n'imposer aucun comportement spécifique.
Considérations pratiques
En général, il n'est pas portable de s'appuyer sur des chaînes littérales ayant le même adresse mémoire à travers les unités de traduction. Cependant, au sein d'une même unité de traduction, le comportement a plus de chances d'être cohérent, car le compilateur a plus de contrôle sur les optimisations.
Conclusion
L'adresse mémoire d'un le littéral de chaîne est un détail d’implémentation et on ne peut pas compter sur sa cohérence entre les unités de traduction. Il est important d'être conscient de ce fait et d'écrire du code indépendant de ces détails d'implémentation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!