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