Referenziert „&s[0]“ zusammenhängende Zeichen in einem std::string?
In C mit „&s[0]“ „Der Zugriff auf das erste Zeichen eines std::string ist eine gängige Praxis, in diesem Zusammenhang bestehen jedoch Bedenken hinsichtlich der Sicherheit. Das Verständnis des zugrunde liegenden Speicherschemas von std::string ist von entscheidender Bedeutung, um dieses Problem zu beheben.
Der C 98/03-Standard erzwang keinen zusammenhängenden Speicher für std::string-Zuweisungen, sodass Implementierungen fragmentierten Speicher verwenden können . Mit der Einführung von C 11 wurde zusammenhängender Speicher jedoch zu einer zwingenden Voraussetzung für std::string.
In der Praxis ist es höchst unwahrscheinlich, dass eine Implementierung vom Ansatz des zusammenhängenden Speichers abweicht. Wie Herb Sutter zugibt, verstößt keine bekannte Implementierung gegen diese Konvention.
Daher ist die Verwendung von „&s[0]“ zur Referenzierung des ersten Zeichens eines std::string sowohl in C 98/03 als auch in C 11 sicher. Der C 11-Standard garantiert dieses Verhalten ausdrücklich, auch für Zeichenfolgen mit der Länge Null. Dies geht aus der Definition von „operator[]“ hervor:
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
Zusätzlich ist die Funktion data() wie folgt definiert:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
Diese Definitionen bestätigen, dass die durch „&s [0]“ verweist auf ein gültiges Zeichen innerhalb der Zeichenfolge, das in modernen C-Implementierungen standardmäßig zusammenhängend ist.
Das obige ist der detaillierte Inhalt vonIst „&s[0]' eine sichere Möglichkeit, auf das erste Zeichen eines std::string in C zuzugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!