34

strlen()NULL をチェックしないのはなぜですか?

もしそうならstrlen(NULL)、プログラムのセグメンテーション違反です。

その背後にある理論的根拠を理解しようとする (もしあれば)。

4

6 に答える 6

38

その背後にある理由は単純です。存在しないものの長さをどのように確認できますか?

また、「マネージ言語」とは異なり、ランタイム システムが無効なデータやデータ構造を正しく処理することは期待されていません。(このタイプの問題はまさに、計算を必要としない、またはパフォーマンスの低いアプリケーションで、より多くの「最新の」言語がより人気がある理由です)。

C の標準テンプレートは次のようになります。

 int someStrLen;

 if (someStr != NULL)  // or if (someStr)
    someStrLen = strlen(someStr);
 else
 {
    // handle error.
 }
于 2011-04-26T20:34:12.797 に答える
22

文字列処理ライブラリを定義する言語標準の部分では、特定の関数に対して特に指定されていない限り、すべてのポインター引数に有効な値が 必要であると規定されています。

C 標準ライブラリの設計の背後にある哲学は、実行時チェックを実行する必要があるかどうかを最終的に判断できるのはプログラマーであるというものです。システム メモリの合計がキロバイト単位で測定されていた時代には、不要な実行時チェックを実行するオーバーヘッドはかなりの負担になる可能性がありました。したがって、C 標準ライブラリはこれらのチェックを一切行いません。本当に必要な場合は、プログラマーが既にそれを行っていると想定します。不正なポインター値を渡さないことがわかっている場合strlen(文字列リテラルやローカルに割り当てられた配列を渡す場合など)、 NULL に対する不必要なチェックで結果のバイナリを乱雑にする必要はありません。

于 2011-04-26T21:29:02.527 に答える
5

標準はそれを必要としないため、実装はテストを回避し、潜在的に高価なジャンプを回避します。

于 2011-04-26T20:34:58.707 に答える
3

3 つの重要な理由:

  • 標準ライブラリと C 言語は、プログラマーが何をしているかを知っていることを前提として設計されているため、null ポインターはエッジ ケースとしてではなく、未定義の動作をもたらすプログラマーのミスとして扱われます。

  • 実行時のオーバーヘッドが発生します。プログラマーが弱虫として扱われない限り、strlen何千回も呼び出して常に実行することは合理的ではありません。str != NULL

  • それはコードのサイズに加算されます - それはほんの数命令である可能性がありますが、この原則を採用してあらゆる場所で実行すると、コードが大幅に肥大化する可能性があります。

于 2011-04-26T20:57:01.737 に答える
2
size_t strlen ( const char * str );

http://www.cplusplus.com/reference/clibrary/cstring/strlen/

Strlen は、文字配列へのポインターをパラメーターとして取ります。null は、この関数の有効な引数ではありません。

于 2011-04-26T20:36:22.230 に答える