2

20x10の2D配列を割り当てようとしているときに、これらのステップのどれでメモリが割り当てられますか

ステップ1:int (*p)[10];

ステップ2:p = malloc( 20 * sizeof(*p) );

すべてのメモリ(20 x 10 x 4バイト)がステップ2で割り当てられますか、それともある程度のメモリがステップ1でも割り当てられますか?

4

2 に答える 2

4

最初のステップは単なるポインターであり、単一のポインター以外には何も割り当てません。これは、ポインタの配列ではなく、配列へのポインタであることを忘れないでください。

配列内で使用されるすべてのストレージは、malloc()呼び出しによって割り当てられます。

于 2012-09-28T13:10:30.230 に答える
3

ステップ 1 では、ポインターを自動変数として作成します。指す型は array-of-10-intです。

ステップ 2 では、20 個のそのような配列にメモリを割り当て (印刷しsizeof(*p)て各配列の大きさを確認します。割り当てられたブロックはその 20 倍です)、そのメモリ ブロックへのポインタを に割り当てますp

これで、p20 個の array-of-10- の配列の最初の要素を指すようになりましたint

理解に役立つ場合、コードは次と同等です。

typedef int my_array[10];
my_array *p = malloc(20 * sizeof(my_array));

その 2 行目は、おそらく で慣れ親しんだものに似ていますmallocsizeof(*p)ただし、代わりにを使用することもできます (使用する必要があります) sizeof(my_array)

malloc非常に単純です。数値を取り、その数のバイトを割り当てます。メモリのタイプは関係ありません。したがって、割り当てているメモリの量が不明な場合は、いつでもその数値を単純に出力できます (またはデバッガで確認できます)。

于 2012-09-28T13:16:56.830 に答える