2

実行時に C で 2 次元配列を割り当てたいと考えています。これは、次のような従来の方法で実現できます。

int *matrix[rows]
for (row = 0; row < rows; ++row) {
  matrix[row] = (int *)malloc(ncol*sizeof(int));
}

しかし、同じことを行う別の方法を見つけました。

int (*p)[rows];
p=(int (*)[rows])malloc(rows*cols*sizeof(int));

2番目の宣言がどのように機能するかを誰か説明できますか? 具体的には、 とはどういう意味(int (*)[rows])mallocですか? 私の知る限り、はまたはmallocのように使用されます。(int *)malloc(ncol*sizeof(int))(char *)malloc(ncol*sizeof(char))

4

2 に答える 2

2

mallocここでは、の戻り値を の配列へのポインタ型にキャストrowsintます。

ところで、C では、voidオブジェクトへのポインターへのポインターのキャストは不要であり、役に立たないことさえあります。これらの詳細について心配する必要はありません。次のコードも実際に機能します。

#include <stdlib.h>

int (*p)[rows];
p = malloc(rows * cols * sizeof(int));
于 2012-10-27T12:00:07.103 に答える
0

これらは同等ではありません.1つ目は整数へのポインターの配列を割り当て、2つ目は整数の配列を割り当ててそれへのポインターを返します.いくつかを隣り合わせに割り当てるだけなので、「配列」に2番目の次元を許可します.

関数の終了後に配列が必要ない場合のより単純なバージョンは次のようになります。

 int matrix[rows][cols];
于 2012-10-27T12:16:13.847 に答える