2012-03-24 9 views
1

various C言語で配列の長さを見つける方法はありますが、言語はそれを提供しません。Cに配列長関数がないのはなぜですか?

このような共通の操作をCやそのリビジョンに含めない理由は何ですか?

+2

関数より優れた演算子(2回適用)があります。なぜあなたはオペレータよりも機能を好むのですか? ???また、2つの数値を加算する関数を使用しないでください。 – pmg

+0

これは単なるメモリブロックへのポインタです。 Javaのような言語では、.length属性などのサポートを可能にする特別なレベルの間接指定があります。 – Adam

+0

確かに誰も知りません。 –

答えて

6

Cの設計理念の1つは、すべてのデータ型が直接メモリにマップされ、長さなどの配列型のメタデータを格納しようとするとその考え方に反しているということです。 Cの開発を記述するデニス・リッチーによってarticleから

、我々はこれを見つける:

胚C
を...
これらのセマンティクスはBから簡単に移行を表現し、私は彼らと実験しました数ヶ月間。型記法を拡張しようとしたとき、特に構造化(レコード)型を追加しようとすると、問題が明らかになりました。構造体は、マシンのメモリ上に直感的な方法でマッピングする必要がありますが、配列を含む構造体では、配列の基底を含むポインタを隠すのに適していませんでした。初期化されました。例えば、初期のUnixシステムのディレクトリエントリはCで記述されているかもしれません。

    struct { 
     int  inumber; 
     char name[14]; 
    }; 
私はこの構造が抽象オブジェクトを特徴付けるだけでなく、ディレクトリから読み込まれる可能性のあるビットの集合を記述することを望んでいました。コンパイラは、セマンティクスが要求する名前へのポインタをどこに隠すことができますか?構造体がより抽象的に考えられていても、ポインタのスペースが何とか隠されていても、構造体を含む構造体を任意の深さに指定した複雑なオブジェクトを割り当てるときに、これらのポインタを適切に初期化するという技術的な問題はどうして処理できますか? この解決策は、タイプのないBCPLと型付きCの間の進化的連鎖における重要な飛躍を構成しました。ストレージ内のポインタのマテリアライゼーションを排除し、配列名が式に記述されたときにポインターの作成を引き起こしました。今日のCで存続するルールは、配列型の値が式に現れたときに、配列を構成する最初のオブジェクトへのポインタに変換されるということです。

強調鉱山。上記の「ポインタ」という言葉を「メタデータ」に置き換えてください。私はあなたの質問に対する答えがあると思います。

4

ここで誰かがC標準委員会にいるのでなければ、権威のある答えを得ることはまずありません。しかし、私が考えることができる2つの理由:

  1. 多くの(ほとんどの場合)状況では、あなたはポインタを持っているだけの配列を持っていません。

  2. アレイに関するメタデータを保存すると、ストレージサイズなどが増加します.Cの一般的なルールは、使用しないものに対してはお支払いを行わないことです。

+0

これは、スタックオーバーフローです。あなたは誰が返信するのか分かりません。 :) – hpique

0

効率が低下しています。 Cは非常に効率的なプログラミング言語です。

+0

とにかく配列の長さを見つける方法があるとすれば、なぜそれを「公式」にするとCは非効率的になりますか? – hpique

+0

@hgpc - 長さが格納されないと効率的です。 'malloc'を使って任意の大きさの配列を作ることができます。 –

+0

効率的なプログラミング言語は人々を非効率にします – aelam

1

Cはオブジェクト指向ではないため、オブジェクトに添付されたメソッドの概念はありません。それはスピードとシンプルさを念頭に置いて設計されており、一般的なイディオムsizeof (array)/sizeof(array[0])は短くて簡単です。

+0

私は 'sizeof(array)/ sizeof(array [0]) 'を単純に呼ぶことはしません。特に、 'array [0]'が未割り当てのときに何が起こっているのかは明らかではないと思います。 – hpique

+0

@hgpc:配列要素は常に割り当てられます。しかし、あなたは 'sizeof'でNULLポインタを参照解除することさえできます。演算子は引数を評価しません: 'struct tm * ptr = NULL; – pmg

+1

あなたは、(一束の大きさ)/(一つの大きさの)大きさは、あなたが直接計算したものではないと言っていますか?物事の数?また、 'sizeof(thing)'は 'thing'のサイズを計算しますが、実際にはそれにはアクセスしないので、' thing'が実際に割り当てられているかどうかは関係ありません。あなたはその文書を読んだことがありますか? –

0

C言語の配列構文は、ポインタ演算の単なる構文上の砂糖です。長さと境界チェックを持つ実配列を作成したい場合は、配列ポインタとその長さを含む構造体を作成し、境界をチェックする関数を通してのみアクセスします。

関連する問題