Heim >Backend-Entwicklung >C++ >Ist der Zugriff auf zusammenhängende Zeichen in std::string mit „&s[0]' in C sicher?

Ist der Zugriff auf zusammenhängende Zeichen in std::string mit „&s[0]' in C sicher?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-05 02:57:09991Durchsuche

Is Accessing Contiguous Characters in std::string Using `&s[0]` Safe in C  ?

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 == &amp;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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn