Hat std::string explizit einen Null-Terminator?
In C und C wird ein Nullzeichen „ “ zum Beenden von Zeichenfolgen verwendet . Im Kontext des std::string-Typs von C ist die Antwort jedoch etwas nuancierter.
Das Standardverhalten
Standardmäßig ist std::string Objekte enthalten kein Null-Terminator. Dies liegt daran, dass std::string seinen eigenen Speicher verwaltet und die Länge der Zeichenfolge intern verfolgt. Daher kennt das Betriebssystem die Länge der Zeichenfolge nicht und der Versuch, über das Ende der Zeichenfolge (einschließlich des Nullterminators) hinaus auf den Speicher zuzugreifen, kann zu undefiniertem Verhalten führen.
Verwendung von c_str()
Wenn Sie jedoch mithilfe der c_str()-Methode ausdrücklich eine nullterminierte Zeichenarray-Darstellung des std::string anfordern, wird dies beim zurückgegebenen Array der Fall sein Fügen Sie den Nullterminator ein. Dies liegt daran, dass c_str() einen Zeiger auf ein temporäres Array zurückgibt, das von std::string erstellt wurde.
Direktes Hinzufügen eines Nullzeichens
Es ist wichtig zu beachten, dass Sie kann wie jedes andere Zeichen manuell ein Nullzeichen in einen std::string einfügen. Dies hat jedoch keinen Einfluss auf das Verhalten der Zeichenfolge selbst. Der std::string verwaltet weiterhin seinen Speicher und verfolgt seine Länge intern. Der Zugriff auf den Speicher über das Ende des Strings hinaus (auch wenn ein Nullzeichen vorhanden ist) kann zu unvorhersehbaren Ergebnissen führen.
Beispiel
Der folgende Code demonstriert dies Verhalten:
string s("hello"); cout << s.size() << ' '; s[1] = '<pre class="brush:php;toolbar:false">5 5
Ausgabe:
Wie Sie sehen können, ändert das Einfügen eines Nullzeichens an Index 1 nicht die Größe der Zeichenfolge, wie von s.size() gemeldet , was darauf hinweist, dass das Nullzeichen von std::string selbst nicht speziell behandelt wird.
Das obige ist der detaillierte Inhalt vonEnthält „std::string' automatisch einen Nullterminator?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!