20

読んだ後null で終了する文字列の根拠は何ですか? また、C#/.Net の文字列は、内部的には、 BSTR Data Typeのように長さのプレフィックスと null で終了することがわかったいくつかの同様の質問があります。

文字列が長さのプレフィックスと null の両方で終了する理由は何ですか? 長さの接頭辞のみ?

4

5 に答える 5

21

計算の長さが。になるように接頭辞が付けられた長さO(1)

アンマネージドブレイジングへのマーシャリングを高速化するためにヌル終了しました(アンマネージドはヌル終了文字列を想定している可能性があります)。

于 2011-06-09T13:35:07.193 に答える
12

以下は、文字列に関するJon Skeet のブログ投稿からの抜粋です。

API に関する限り、文字列は null で終了しませんが、文字配列は null で終了します。これは、inter-op で文字列がUnicode としてマーシャリングする必要があります。

于 2011-06-09T13:33:45.820 に答える
4

ほとんどの場合、COM との簡単な相互運用性を確保するためです。

于 2011-06-09T13:31:29.310 に答える
3

length フィールドを使用すると、フレームワークが文字列の長さを簡単に判断できます (また、文字列にゼロ値の文字を含めることができます) が、フレームワーク (またはユーザー プログラム) が処理する必要があるものは非常に多くあります。 NULL で終了する文字列。

たとえば、Win32 API のように。

そのため、文字列データの末尾に NULL ターミネータを付けておくと便利です。これは、いずれにせよかなり頻繁に必要になるからです。

C++ のstd::stringクラスは同じ方法で実装されていることに注意してください (とにかく MSVC で)。同じ理由で、確かに (は、C スタイルの文字列が必要なものにc_str()a を渡すためによく使用されます)。std::string

于 2011-06-09T13:44:27.363 に答える
1

最良の推測は、長さを見つけることは、それをトラバースしてO(n)で実行する場合と比較して、一定(O(1))であるということです。

于 2011-06-09T13:34:24.457 に答える