"&s[0]" fait-il référence à des caractères contigus dans une std::string ?
En C, en utilisant "&s[0] " pour accéder au premier caractère d'un std::string est une pratique courante, mais des inquiétudes surviennent quant à sa sécurité dans ce contexte. Comprendre le schéma de stockage sous-jacent de std::string est crucial pour résoudre ce problème.
La norme C 98/03 n'imposait pas de stockage contigu pour les allocations std::string, ce qui permettait aux implémentations d'utiliser de la mémoire fragmentée. . Cependant, avec l'avènement de C 11, le stockage contigu est devenu une exigence obligatoire pour std::string.
En pratique, il est très peu probable de rencontrer une implémentation qui s'écarte de l'approche de stockage contigu. Comme le reconnaît Herb Sutter, aucune implémentation connue ne viole cette convention.
Par conséquent, utiliser "&s[0]" pour référencer le premier caractère d'une chaîne std::string est sûr à la fois en C 98/03 et en C 11. La norme C 11 garantit explicitement ce comportement, même pour les chaînes de longueur nulle. Cela ressort clairement de la définition de l'opérateur[] :
Returns: *(begin() + pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified
De plus, la fonction data() est définie comme :
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
Ces définitions confirment que la référence obtenue via "&s [0]" pointe vers un caractère valide dans la chaîne, qui est contigu par défaut dans les implémentations C modernes.
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!