答えて
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. 2D配列のC malloc:なぜセグメンテーションフォルトがないのですか?
- 2. MouseListed()関数でArrayListの長さが0になるのはなぜですか?
- 3. 配列がC++の関数に正しく渡されない
- 4. なぜ、この配列のjavascript関数を使用しないのですか?
- 5. 関数ファイルが空の配列を返すのはなぜですか?
- 6. C++関数ポインター名前のない関数を持つ配列
- 7. 配列アクセサの構文が関数の戻り値に直接作用しないのはなぜですか?
- 8. JavaScript関数が配列にデータを入力しないのはなぜですか?
- 9. 文字列のバイトサイズが長さよりも長いのはなぜですか?
- 10. 基本的なC配列関数
- 11. C++ .ignore()関数が正しく動作しないのはなぜですか?
- 12. IEがjquery関数で配列を呼び出さないのはなぜですか?
- 13. C#:バイト配列で初期化できないのはなぜですか?
- 14. C++で動的配列が必要なのはなぜですか?
- 15. 関数のShowインスタンスがないのはなぜですか?
- 16. 私のMatlab関数が配列を受け入れないのはなぜですか?
- 17. 関数はなぜC#のStartswithより速いですか?
- 18. SetupDiGetDeviceProperty関数が機能しないのはなぜですか?
- 19. paleoTS関数が機能しないのはなぜですか?
- 20. SendMessage()関数が機能しないのはなぜですか?
- 21. jquery関数がトリガーされないのはなぜですか?
- 22. 仮想関数が非常に遅いのはなぜですか? C++
- 23. 定数配列を引数として渡せないのはなぜですか? Cで
- 24. absのような組み込み関数がnumpy配列で動作するのはなぜですか?
- 25. C++チュートリアルで文字列の配列が文字列に使用されているのはなぜですか?
- 26. なぜFileStream.Lengthはlong型ですが、FileStream.Read引数 - offsetの長さが短いのはなぜですか?
- 27. Promise.all(配列)がすぐに解決されないのはなぜですか?
- 28. なぜC#CreateObjectはVB.NETよりも冗長なのですか?
- 29. 配列パラメータを受け取る関数でSetLengthを使用できないのはなぜですか?
- 30. C/C++に|| =演算子がないのはなぜですか?
関数より優れた演算子(2回適用)があります。なぜあなたはオペレータよりも機能を好むのですか? ???また、2つの数値を加算する関数を使用しないでください。 – pmg
これは単なるメモリブロックへのポインタです。 Javaのような言語では、.length属性などのサポートを可能にする特別なレベルの間接指定があります。 – Adam
確かに誰も知りません。 –