私の同僚がこの質問をしました:ポインターを使用した多次元配列の配列サイズ
ポインターによって参照される配列のサイズを計算できないという点で、答えはすべてかなり決定的です。
最初に考えたのは、まずポインターを逆参照してから、配列自体のサイズを計算することでした。なぜこれがうまくいかないのでしょうか?ポインターを逆参照すると、完全な配列が得られませんか?
私の同僚がこの質問をしました:ポインターを使用した多次元配列の配列サイズ
ポインターによって参照される配列のサイズを計算できないという点で、答えはすべてかなり決定的です。
最初に考えたのは、まずポインターを逆参照してから、配列自体のサイズを計算することでした。なぜこれがうまくいかないのでしょうか?ポインターを逆参照すると、完全な配列が得られませんか?
Cには「完全な配列」はありません。少なくとも、期待しているようには見えません。
配列は常に、配列のレイアウトに関する情報とともに、最初の要素へのポインターとして表すことができます。
この情報は実行時には利用できず、実際の配列の型の一部 ( などint foo[6][2][12]
) であるため、コンパイラはコードを生成して要素にアクセスするときにその知識を直接使用できます。Lundin が指摘したように、例外は可変長配列 (C99 で導入) です。これらの場合、コンパイラは実行時コードを追加して機能させる必要がありますsizeof
。
foo
を受け取る関数に渡す場合int *
、そこから次元データを魔法のように再作成する方法はありません。すべてのポインタint
は同じように見えます。&foo[0][0][0]
プレーンのアドレスを渡すか、アドレスだけを渡すことができますint
。
残念ながら、配列のサイズを決定する方法は C にはありません。配列は、メモリ位置への単なるポインタです。その場所のメモリの量が配列の一部であることを知る必要があります。
そのため、配列を使用する標準ライブラリのほとんどのメソッドは、nul で終わる配列、またはそれらの長さを示す追加の引数が必要です。