ホームページ >バックエンド開発 >C++ >C で `&s[0]` を使用して std::string の連続文字にアクセスするのは安全ですか?

C で `&s[0]` を使用して std::string の連続文字にアクセスするのは安全ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-05 02:57:09990ブラウズ

Is Accessing Contiguous Characters in std::string Using `&s[0]` Safe in C  ?

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 == &amp;operator[](i) for each i in [0, size()].

したがって、&s[0] は次のようになります。文字列の最初の文字への有効なポインタ。

注: の前標準化では、空の文字列の &s[0] へのアクセスは未定義の動作でした。ただし、この問題はその後の標準ドラフトで解決されました。

以上がC で `&s[0]` を使用して std::string の連続文字にアクセスするのは安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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