Maison >développement back-end >C++ >`&s[0]` est-il un pointeur sûr et contigu vers des caractères dans une chaîne C std::string ?

`&s[0]` est-il un pointeur sûr et contigu vers des caractères dans une chaîne C std::string ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-05 15:41:10960parcourir

Is `&s[0]` a Safe and Contiguous Pointer to Characters in a C   std::string?

"&s[0]" peut-il référencer des caractères consécutifs dans une std::string ?

Il a été remarqué que du code comme celui-ci :

std::string s;
s.resize( strLength );
memcpy( &s[0], str, strLength );

serait sûr si s était un std::vecteur, mais la question est de savoir s'il s'agit d'une utilisation sûre de std::string.

Dans C 98/03, il n'est pas garanti que l'allocation d'un std::string soit contiguë. Cependant, C 11 impose cette contiguïté. En pratique, la plupart des implémentations utilisent le stockage contigu.

L'utilisation de &s[0] est garantie par la norme C 11 pour fonctionner, même pour les chaînes de longueur nulle. En effet, l'opérateur[] est défini comme :

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, data() est défini comme :

Returns: A pointer p such that p + i == &s[i] for each i in [0,size()].

Par conséquent, "&s[0]" pointe vers des caractères consécutifs dans un std::string et constitue une utilisation sûre.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn