答えて
Cの設計理念の1つは、すべてのデータ型が直接メモリにマップされ、長さなどの配列型のメタデータを格納しようとするとその考え方に反しているということです。 Cの開発を記述するデニス・リッチーによってarticleから
、我々はこれを見つける:
胚C
を...
これらのセマンティクスはBから簡単に移行を表現し、私は彼らと実験しました数ヶ月間。型記法を拡張しようとしたとき、特に構造化(レコード)型を追加しようとすると、問題が明らかになりました。構造体は、マシンのメモリ上に直感的な方法でマッピングする必要がありますが、配列を含む構造体では、配列の基底を含むポインタを隠すのに適していませんでした。初期化されました。例えば、初期のUnixシステムのディレクトリエントリはCで記述されているかもしれません。私はこの構造が抽象オブジェクトを特徴付けるだけでなく、ディレクトリから読み込まれる可能性のあるビットの集合を記述することを望んでいました。コンパイラは、セマンティクスが要求する名前へのポインタをどこに隠すことができますか?構造体がより抽象的に考えられていても、ポインタのスペースが何とか隠されていても、構造体を含む構造体を任意の深さに指定した複雑なオブジェクトを割り当てるときに、これらのポインタを適切に初期化するという技術的な問題はどうして処理できますか? この解決策は、タイプのないBCPLと型付きCの間の進化的連鎖における重要な飛躍を構成しました。ストレージ内のポインタのマテリアライゼーションを排除し、配列名が式に記述されたときにポインターの作成を引き起こしました。今日のCで存続するルールは、配列型の値が式に現れたときに、配列を構成する最初のオブジェクトへのポインタに変換されるということです。struct { int inumber; char name[14]; };
強調鉱山。上記の「ポインタ」という言葉を「メタデータ」に置き換えてください。私はあなたの質問に対する答えがあると思います。
ここで誰かがC標準委員会にいるのでなければ、権威のある答えを得ることはまずありません。しかし、私が考えることができる2つの理由:
多くの(ほとんどの場合)状況では、あなたはポインタを持っているだけの配列を持っていません。
アレイに関するメタデータを保存すると、ストレージサイズなどが増加します.Cの一般的なルールは、使用しないものに対してはお支払いを行わないことです。
これは、スタックオーバーフローです。あなたは誰が返信するのか分かりません。 :) – hpique
Cはオブジェクト指向ではないため、オブジェクトに添付されたメソッドの概念はありません。それはスピードとシンプルさを念頭に置いて設計されており、一般的なイディオムsizeof (array)/sizeof(array[0])
は短くて簡単です。
私は 'sizeof(array)/ sizeof(array [0]) 'を単純に呼ぶことはしません。特に、 'array [0]'が未割り当てのときに何が起こっているのかは明らかではないと思います。 – hpique
@hgpc:配列要素は常に割り当てられます。しかし、あなたは 'sizeof'でNULLポインタを参照解除することさえできます。演算子は引数を評価しません: 'struct tm * ptr = NULL; – pmg
あなたは、(一束の大きさ)/(一つの大きさの)大きさは、あなたが直接計算したものではないと言っていますか?物事の数?また、 'sizeof(thing)'は 'thing'のサイズを計算しますが、実際にはそれにはアクセスしないので、' thing'が実際に割り当てられているかどうかは関係ありません。あなたはその文書を読んだことがありますか? –
C言語の配列構文は、ポインタ演算の単なる構文上の砂糖です。長さと境界チェックを持つ実配列を作成したい場合は、配列ポインタとその長さを含む構造体を作成し、境界をチェックする関数を通してのみアクセスします。
- 1. なぜ矢印関数に引数配列がないのですか?
- 2. 関数が配列を返さないのはなぜですか?
- 3. 関数が配列を返さないのはなぜですか?
- 4. 2D配列のC malloc:なぜセグメンテーションフォルトがないのですか?
- 5. 可変長配列が変換されないのはなぜですか?
- 6. 配列の初期化後に配列の長さが正しくないのはなぜですか?
- 7. Pythonの 'len'関数がバイト配列の長さを誇張しているのはなぜですか?
- 8. MouseListed()関数でArrayListの長さが0になるのはなぜですか?
- 9. リストに配列があるのはなぜですか? C#
- 10. 配列がC++の関数に正しく渡されない
- 11. 固定長配列へのポインタのアドレスを、Cのポインタへのポインタを期待する関数に渡せないのはなぜですか?
- 12. この関数が空の配列を返すのはなぜですか?
- 13. なぜ、この配列のjavascript関数を使用しないのですか?
- 14. 関数ファイルが空の配列を返すのはなぜですか?
- 15. この配列が空でないのはなぜですか?
- 16. 最初に定義されていない長さの静的配列がC++でコンパイルエラーにならないのはなぜですか?
- 17. void関数がC++で何も印刷しないのはなぜですか?
- 18. C++関数ポインター名前のない関数を持つ配列
- 19. 配列の長さ内部関数が異なる
- 20. C関数が配列を自動的に変更するのはなぜですか?
- 21. 配列の変数名がスタックで宣言されていないのはなぜですか?C++?
- 22. Java 8に「myArray.stream()」関数がないのはなぜですか?
- 23. 配列アクセサの構文が関数の戻り値に直接作用しないのはなぜですか?
- 24. 関数外の配列に値が保持されないのはなぜですか?
- 25. C++ .ignore()関数が正しく動作しないのはなぜですか?
- 26. 文字列のバイトサイズが長さよりも長いのはなぜですか?
- 27. JavaScript関数が配列にデータを入力しないのはなぜですか?
- 28. 関数を配列にプッシュします。なぜ配列の値は整数ですか?
- 29. C#:バイト配列で初期化できないのはなぜですか?
- 30. node.jsのコールバック関数からオブジェクトを配列にプッシュできないのはなぜですか?
関数より優れた演算子(2回適用)があります。なぜあなたはオペレータよりも機能を好むのですか? ???また、2つの数値を加算する関数を使用しないでください。 – pmg
これは単なるメモリブロックへのポインタです。 Javaのような言語では、.length属性などのサポートを可能にする特別なレベルの間接指定があります。 – Adam
確かに誰も知りません。 –