そうです、あなたが望むのはポインターの配列です。Java では、次のようなものがある場合はいつでも注意してください。
String s = ...;
これは、c のポインターに変換されます。
String *s = ...;
最初に、固定サイズのポインター配列の簡単なケースを考えてみましょう。これは単純です:
creature *creatures[10];
for (var i=0; i < 10; i++) {
creatures[i] = malloc(sizeof(creature));
}
これで、それぞれ個別に malloc された、クリーチャーへのポインターの配列ができました。ただし、クリーチャーの配列の大きさがわからない場合は、クリーチャーの配列を malloc する必要があります。たとえば、malloc された int 配列がある場合は、次のようにすることに注意してください。
int *ints = malloc(sizeof(int) * 10);
ints[0]; ints[1]; //etc...
つまり、配列は最初の要素へのポインタとして表されます。今欲しいのはポインタの配列で、最終的にはポインタへのポインタになります:
var numCritters = 10;
creature **creatures = malloc(sizeof(creature *) * numCritters);
for (var i=0; i < numCritters; numCritters++) {
creatures[i] = malloc(sizeof(creature));
}
1 つ目malloc
は、ポインターの配列へのポインターを作成しcreature *
ます。sizeof(creature *)
ここでは ではなくを使用していることに注意してくださいsizeof(creature)
。これは、配列が s ではなくポインターであるためですcreature
。
次の のそれぞれは、固定サイズの配列の場合と同様に、malloc
へのポインタを作成します。creature
必ずfree
for each を用意してください。malloc
つまり、それぞれcreature *
に 1 つと に 1 つですcreature **
。
これはPankratesが提案したものとは異なることに注意してください。どのソリューションを使用するかは、何をしたいかによって異なります。彼は s の大きなブロックを作成しますcreature
:
creature *creatures = +--------------------+
| |
| |
| Creature 0 |
| |
| |
+--------------------+
| |
| |
| Creature 1 |
| |
| |
+--------------------+
| |
| |
| Creature 2 |
| |
| |
+--------------------+
| ... |
私のものはポインタの配列を作成しますが、それぞれが次を指していcreature
ます:
+--------------------+
| |
creature *creatures = +------+ | |
| ptr0 | ----> | Creature 0 |
+--------------------+ +------+ | |
| | +-- | ptr1 | | |
| | | +------+ +--------------------+
| Creature 1 | <-+ | ptr2 | --+
| | +------+ | +--------------------+
| | | .... | | | |
+--------------------+ | | |
+-> | Creature 2 |
| |
| |
+--------------------+