Zugriff auf zusammenhängende Zeichen in std::string
In C kann man auf den folgenden Code stoßen:
std::string s; s.resize(strLength); memcpy(&s[0], str, strLength); // Is this safe?
Während die Verwendung von &s[0] in std::vector sicher ist, gibt die Verwendung in std::string Anlass zur Sorge. In diesem Artikel wird die Sicherheit des vorgestellten Codes untersucht.
In C 98/03 wurde nicht garantiert, dass die Zuordnung eines std::string zusammenhängend ist. C 11 verlangt jedoch Kontiguität. In der Praxis verwenden alle bekannten Implementierungen zusammenhängenden Speicher.
Darüber hinaus garantiert der C 11-Standard die Sicherheit von &s[0], auch für einen leeren String. Dies liegt daran, dass der Operator[] für std::string wie folgt definiert ist:
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
Darüber hinaus ist data() wie folgt definiert:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
Somit &s[0] liefert ein gültiger Zeiger auf das Anfangszeichen der Zeichenfolge.
Hinweis:Vor der Standardisierung ist der Zugriff auf &s[0] Für eine leere Zeichenfolge war das Verhalten undefiniert. Dies wurde jedoch inzwischen in späteren Standardentwürfen behoben.
Das obige ist der detaillierte Inhalt vonIst der Zugriff auf zusammenhängende Zeichen in std::string mit „&s[0]' in C sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!