web-dev-qa-db-ja.com

2次元配列を割り当てる気まぐれな方法?

プロジェクトで、誰かが次の行をプッシュしました:

double (*e)[n+1] = malloc((n+1) * sizeof(*e));

おそらく(n + 1)*(n + 1)doubleの2次元配列を作成します。

おそらく、これまでのところ、私が尋ねた誰も、これが何をするのか、正確に、それがどこから来たのか、なぜそれが機能するのかを伝えることができなかったので、私はそうではありませんまだそれを購入しています)。

おそらく私は明白な何かを見逃していますが、誰かが私に上記の行を説明できるなら、私はそれを感謝します。個人的には、私たちが実際に理解しているものを使用すれば、ずっと気分が良くなるでしょう。

110
User1291

変数eは、double型のn + 1要素の配列へのポインターです。

eで間接参照演算子を使用すると、eの基本型が得られます。これは、「double型のn + 1要素の配列」です。

malloc呼び出しは、基本型のe(上記で説明)を取得してそのサイズを取得し、それにn + 1を掛けて、そのサイズをmalloc関数に渡します。基本的に、n + 1の配列n + 1の配列doubleの要素を割り当てます。

87

これは、2D配列を動的に割り当てる典型的な方法です。

  • eは、タイプ_double [n+1]_の配列への配列ポインターです。
  • したがって、sizeof(*e)は、1つの_double [n+1]_配列のサイズである、指摘された型の型を提供します。
  • このような配列_n+1_にスペースを割り当てます。
  • 配列ポインターeは、この配列の配列の最初の配列を指すように設定します。
  • これにより、eを_e[i][j]_として使用して、2D配列の個々のアイテムにアクセスできます。

個人的には、このスタイルは読みやすいと思います。

_double (*e)[n+1] = malloc( sizeof(double[n+1][n+1]) );
_
56
Lundin