std::string の連続文字へのアクセス
C で次のコードが発生する可能性があります:
std::string s; s.resize(strLength); memcpy(&s[0], str, strLength); // Is this safe?
&s[0] を std::vector で使用するのは安全ですが、 std::string は懸念を引き起こします。この記事では、提示されたコードの安全性を検証します。
C 98/03 では、std::string の割り当てが連続していることが保証されていませんでした。ただし、C 11 では隣接性が義務付けられています。実際には、既知の実装はすべて連続ストレージを使用します。
さらに、C 11 標準では、空の文字列であっても &s[0] の安全性が保証されています。これは、std::string の Operator[] が次のように定義されているためです:
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
さらに、data() は次のように定義されています:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
したがって、&s[0] は次のようになります。文字列の最初の文字への有効なポインタ。
注: の前標準化では、空の文字列の &s[0] へのアクセスは未定義の動作でした。ただし、この問題はその後の標準ドラフトで解決されました。
以上がC で `&s[0]` を使用して std::string の連続文字にアクセスするのは安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。