Does std::string Explicitly Have a Null Terminator?
C および C では、文字列を終了するために null 文字 ' ' が使用されます。ただし、 C の std::string 型のコンテキストでは、答えはもう少し微妙です。
デフォルトの動作
デフォルトでは、 std::stringオブジェクトにはヌル終端文字が含まれません。これは、std::string が独自のメモリを管理し、文字列の長さを内部的に追跡するためです。そのため、オペレーティング システムは文字列の長さを認識せず、文字列の末尾 (null ターミネータを含む) を超えてメモリにアクセスしようとすると、未定義の動作が発生する可能性があります。
c_str() の使用
ただし、c_str() を使用して std::string の null 終了文字配列表現を具体的にリクエストした場合は、メソッドを使用すると、返される配列には null ターミネータが含まれます。これは、c_str() が std::string によって作成された一時配列へのポインタを返すためです。
Null 文字を直接追加する
次の点に注意することが重要です。他の文字と同様に、null 文字を std::string に手動で挿入できます。ただし、これは文字列自体の動作には影響しません。 std::string は内部でメモリを管理し、その長さを追跡します。文字列の末尾を超えてメモリにアクセスすると (Null 文字がある場合でも)、予測できない結果が生じる可能性があります。
例
次のコードはこれを示しています動作:
string s("hello"); cout << s.size() << ' '; s[1] = '<pre class="brush:php;toolbar:false">5 5'; cout << s.size() << '\n';
出力:
ご覧のとおり、インデックス 1 に null 文字を挿入しても、s.size() によって報告される文字列のサイズは変わりません。これは、null 文字が std::string 自体によって特別に扱われないことを示します。
以上が`std::string` には自動的に Null ターミネータが含まれますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。