20x10の2D配列を割り当てようとしているときに、これらのステップのどれでメモリが割り当てられますか
ステップ1:int (*p)[10];
ステップ2:p = malloc( 20 * sizeof(*p) );
すべてのメモリ(20 x 10 x 4バイト)がステップ2で割り当てられますか、それともある程度のメモリがステップ1でも割り当てられますか?
20x10の2D配列を割り当てようとしているときに、これらのステップのどれでメモリが割り当てられますか
ステップ1:int (*p)[10];
ステップ2:p = malloc( 20 * sizeof(*p) );
すべてのメモリ(20 x 10 x 4バイト)がステップ2で割り当てられますか、それともある程度のメモリがステップ1でも割り当てられますか?
最初のステップは単なるポインターであり、単一のポインター以外には何も割り当てません。これは、ポインタの配列ではなく、配列へのポインタであることを忘れないでください。
配列内で使用されるすべてのストレージは、malloc()
呼び出しによって割り当てられます。
ステップ 1 では、ポインターを自動変数として作成します。指す型は array-of-10-int
です。
ステップ 2 では、20 個のそのような配列にメモリを割り当て (印刷しsizeof(*p)
て各配列の大きさを確認します。割り当てられたブロックはその 20 倍です)、そのメモリ ブロックへのポインタを に割り当てますp
。
これで、p
20 個の array-of-10- の配列の最初の要素を指すようになりましたint
。
理解に役立つ場合、コードは次と同等です。
typedef int my_array[10];
my_array *p = malloc(20 * sizeof(my_array));
その 2 行目は、おそらく で慣れ親しんだものに似ていますmalloc
。sizeof(*p)
ただし、代わりにを使用することもできます (使用する必要があります) sizeof(my_array)
。
malloc
非常に単純です。数値を取り、その数のバイトを割り当てます。メモリのタイプは関係ありません。したがって、割り当てているメモリの量が不明な場合は、いつでもその数値を単純に出力できます (またはデバッガで確認できます)。