1

私はcを学んでおり、構造体の保存と管理の問題に遭遇しました。説明させてください。

私は Java に精通しており、c でポインターと参照を適切に使用する方法を理解し始めています。私の目標は、何百ものスタックを作成して保存することです。

struct creature{
  int id;
  char name[12];
}

Java では、次のような配列を作成できます。

creature c [];

次に、その配列内にオブジェクトを格納して操作します。構造体「クリーチャー」を使用して、cで同じ効果が必要です。

私の最初の試みは:

creature *creatures = malloc(sizeof(creature));

それが何をするのか、私には完全にはわかりません。私の目標は、Java 配列のような構造体ポインタを厳密に保持するメモリ ブロックを作成することでした。

ここから、新しいクリーチャー構造体を作成し、それらのポインターを、malloc を使用して割り当てられたメモリを持つクリーチャー変数に格納します。

これが私の問題を説明するのに十分な情報であることを願っています。

ありがとう!

4

2 に答える 2

3

そうです、あなたが望むのはポインターの配列です。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

必ずfreefor 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     |
                                             |                    |
                                             |                    |
                                             +--------------------+
于 2013-09-30T22:32:13.087 に答える
1

あなたはほとんどそこにいます。malloc引数として割り当てたいバイト数を取るため、構造体のサイズに割り当てたい構造体の数を掛ける必要があります。

int number_of_creatures = 10;
creature *creatures = malloc(sizeof(creature) * number_of_creatures);

malloc()また、割り当てが成功したかどうかを確認するために、返されたポインターを常に確認する必要があります。

if (creatures == NULL)
    printf("Allocating memory failed!\n");
于 2013-09-30T22:29:40.720 に答える