Incompatibilité d'adresses littérales de chaîne entre les unités de traduction
En C et C, il est souvent supposé que les littéraux de chaîne dans différentes unités de traduction (fichiers objets créé lors de la compilation) auront la même adresse mémoire. Cependant, cette idée n'est pas portable entre les compilateurs et les implémentations.
Selon les projets de normes C99 et C, le comportement concernant les littéraux de chaîne identiques n'est explicitement pas spécifié. Cela signifie que le compilateur est libre de les regrouper, de les fusionner ou de créer des instances distinctes pour chaque référence.
Visual Studio autorise explicitement le regroupement de littéraux de chaîne via l'option du compilateur /GF, tandis que GCC le prend en charge avec les constantes -fmerge. drapeau. Cependant, les deux compilateurs utilisent cette fonctionnalité de manière conditionnelle, en fonction de la disponibilité d'un matériel spécifique ou de la prise en charge de l'éditeur de liens.
Ainsi, il n'est pas portable de s'appuyer sur la même adresse mémoire pour les littéraux de chaîne dans différentes unités de traduction. Même au sein d'une même unité de traduction, les optimisations du compilateur peuvent conduire à un comportement imprévisible lors du traitement des chaînes littérales.
Ce manque de standardisation découle de la nature diversifiée des implémentations C au moment du développement du langage. Étant donné que les systèmes basés sur ROM exigeaient que les littéraux de chaîne soient stockés dans une mémoire morte, il a été jugé peu pratique de garantir l'unicité et l'écriture des littéraux de chaîne.
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!