Zugriff auf Zeichen über „&s[0]“ in einem std::string
In C bietet die Klasse std::string eine bequeme Möglichkeit, Zeichenfolgen zu manipulieren. Die zugrunde liegende Darstellung von Zeichenfolgendaten kann jedoch je nach Implementierung unterschiedlich sein, was zu Fragen zur Speichersicherheit führt.
Frage:
Verwendet „&s[0]“? Zugriffszeichen in einem std::string garantieren zusammenhängenden Speicher Zuordnung?
Antwort:
Unter dem C 98/03-Standard ist die Speicherzuordnung eines std::string nicht explizit definiert und überlässt es der Implementierung . Der C 11-Standard schreibt jedoch zusammenhängende Speicherung für std::string-Objekte vor.
In der Praxis haben die meisten Implementierungen, sowohl vor als auch nach der Standardisierung von C 11, zusammenhängende Speicherung für std::string übernommen. Dies bedeutet, dass die Verwendung von „&s[0]“ für den Zugriff auf Zeichen im Allgemeinen als sicher gilt.
Standardgarantierter Zugriff:
Gemäß dem C 11-Standard ist der Operator[ ] für std::string garantiert immer den Zugriff auf eine gültige Zeichenreferenz. Selbst in Fällen, in denen die Zeichenfolge leer ist, ist „&s[0]“ so definiert, dass es auf ein Objekt mit einem charT()-Wert zeigt, wodurch sichergestellt wird, dass es eine gültige Speicherreferenz bleibt.
Dies wird durch die noch verstärkt Definition von data() für std::string, die angibt, dass der zurückgegebene Zeiger „p“ auf aufeinanderfolgende Speicherorte verweisen soll, die mit den über „&operator[](i)“ zugänglichen Elementen innerhalb des gültigen Bereichs übereinstimmen [0,size()].
Historische Anmerkung:
In früheren Versionen des C 0x-Standards war das Verhalten von „&s[0]“ mit Null- Die Länge der Zeichenfolgen war nicht definiert. Allerdings haben die Vorstandardisierung C 0x und nachfolgende Standardentwürfe dieses Verhalten klargestellt und garantiert, dass „&s[0]“ in allen Fällen auf eine gültige Speicherreferenz verweist.
Das obige ist der detaillierte Inhalt vonGarantiert „&s[0]' eine zusammenhängende Speicherzuweisung in einem C „std::string'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!