ホームページ  >  記事  >  バックエンド開発  >  C 11 の `string::c_str()` は依然として Null で終了する文字列を保証しますか?

C 11 の `string::c_str()` は依然として Null で終了する文字列を保証しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-27 15:35:02344ブラウズ

 Does C  11's `string::c_str()` Still Guarantee a Null-Terminated String?

C 11 の string::c_str() 関数は Null 終端ではなくなりましたか?

C では、basic_string クラスがさまざまなメソッドを提供します。その文字にアクセスします。これらのメソッドの 1 つである c_str() は、C 11 以降混乱の原因となってきました。C 11 より前では、c_str() は文字列の内容を表す null で終了する文字配列を返す役割を担っていました。

ただし、 C 11 では、basic_string::c_str() の定義が変更されました。これは、basic_string::data と同じになるように定義されるようになり、文字列の内部文字バッファーの先頭へのポインターを返します。これにより疑問が生じました: この変更は、c_str() がヌル終了文字列を保証しなくなったことを意味しますか?

答え: 文字列には内部的にヌル終了バッファが必要です

この質問に対する答えはノーです。 C 11 での変更にもかかわらず、文字列は依然として内部で null 終了バッファを使用する必要があります。これは、C 標準の Operator[] メソッド (21.4.5) の定義から明らかです。

Requires: pos <= size().
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.

c_str() は、operator[]:

Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].
c_str() と data は両方とも O(1) 操作である必要があるため、実装では事実上 null 終了バッファの使用が強制されます。さらに、operator[] の戻り値要件により、c_str() が null で終了するバッファへのポインタを返すことが保証されます。したがって、C 11.

での変更にもかかわらず、c_str() は引き続きヌル終了文字列を提供します。

以上がC 11 の `string::c_str()` は依然として Null で終了する文字列を保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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