宣言 によるとint** test;
、test
はポインターへのポインターであり、コード pice は、malloc 関数を使用して動的に int 値のマトリックスにメモリを割り当てます。
声明:
test = (int **)malloc(k * sizeof(int*));
// ^^------^^-------
// allocate for k int* values
k
int ( ) へのポインタに継続メモリを割り当てint*
ます。したがって、k = 4
次のようなものが得られたとします。
temp 343 347 351 355
+----+ +----+----+----+----+
|343 |---►| ? | ? | ? | ? |
+----+ +----+----+----+----+
アドレスは 4 バイトであり、?
ガベージ値を意味すると想定しています。
temp
変数に割り当てられた変数は、malloc によって返されたアドレスを割り当てます。malloc は、サイズ = のメモリ ブロックを割り当て続けます =k * sizeof(int**)
私の例では = 16 バイトです。
for ループでは、k
int にメモリを割り当て、返されたアドレスをtemp[i]
(以前に割り当てられた配列の場所) に割り当てます。
test[i] = (int*)malloc(k * sizeof(int)); //Initialize all the values
// ^^-----^^----------
// allocate for k int values
注: 式temp[i]
== *(temp + i)
. したがって、各反復の for ループでは、次のような k int 値の配列にメモリを割り当てます。
First malloc For loop
--------------- ------------------
temp
+-----+
| 343 |--+
+-----+ |
▼ 201 205 209 213
+--------+ +-----+-----+-----+-----+
343 | |= *(temp + 0) | ? | ? | ? | ? | //for i = 0
|temp[0] |-------| +-----+-----+-----+-----+
| 201 | +-----------▲
+--------+ 502 506 510 514
| | +-----+-----+-----+-----+
347 |temp[1] |= *(temp + 1) | ? | ? | ? | ? | //for i = 1
| 502 |-------| +-----+-----+-----+-----+
+--------+ +-----------▲
| | 43 48 52 56
351 | 43 | +-----+-----+-----+-----+
|temp[2] |= *(temp + 2) | ? | ? | ? | ? | //for i = 2
| |-------| +-----+-----+-----+-----+
+--------+ +-----------▲
355 | |
| 9002 | 9002 9006 9010 9014
|temp[3] | +-----+-----+-----+-----+
| |= *(temp + 3) | ? | ? | ? | ? | //for i = 3
+--------+ | +-----+-----+-----+-----+
+-----------▲
繰り返し?
ますが、ガベージ値を意味します。
追加のポイント:
1) 返されたアドレスを malloc でキャストしていますが、C では避ける必要があります。malloc の結果をキャストしますか?を参照してください。次のようにしてください:
test = malloc(k* sizeof(int*));
for (i = 0; i < k; i++){
test[i] = malloc(k * sizeof(int));
}
2)メモリを動的に割り当てている場合は、作業が完了したときにメモリを明示的に解放する必要があります(動的に割り当てられたメモリを解放した後は、そのメモリにアクセスできません)。メモリを解放する手順test
は次のとおりです。
for (i = 0; i < k; i++){
free(test[i]);
}
free(test);
3) これは、2D マトリックスにメモリを配列の配列として割り当てる 1 つの方法です。すべての配列に完全に継続してメモリを割り当てたい場合は、この回答を確認してください:関数 C でメモリ 2 次元配列を割り当てる
4) 説明が役に立ち、3D 割り当てについて学習したい場合は、この回答を確認してください:文字列または/ 3D char 配列の行列