ホームページ >バックエンド開発 >C++ >`std::string` には自動的に Null ターミネータが含まれますか?

`std::string` には自動的に Null ターミネータが含まれますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-06 16:04:12499ブラウズ

Does `std::string` Automatically Include a Null Terminator?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。