ポインターの配列にしたい場合はpeople
、次のように宣言する必要があります。
struct person *people[12];
宣言は使用後に行われ、逆参照は配列のインデックス付けよりも優先順位が低いことに注意してください。これ*people[i]
は が 型struct person
であり、したがってpeople[i]
へのポインタであることを意味しますstruct person
。
の各位置を初期化するにはpeople
、 を呼び出しmalloc()
て、struct person
. 次のように簡単です。
people[i] = malloc(sizeof(struct person));
もう必要がなくなったら、 for every positionpeople
を呼び出して、割り当てたすべてのメモリ位置を解放することを忘れないでください。free(people[i])
i
12 個の構造体を保持する配列を宣言していることに気付きました。これは、誰かがコードを変更すると危険な場合があります:HOW_MANY
が 12 より大きい場合は機能しません。同じサイズの配列を宣言する必要があります。
struct person *people[HOW_MANY];
これにより、アレイに常に必要なスペースが正確に確保されます。
更新:insert
構造体の配列ではなく、ポインターの配列を受け取る
と宣言する必要があります。
static void insert (struct person *people[], char *name, int age) { ... }
そしてpeople[i].name
無効です。は現在ポインターであるためpeople[i]
、次のようにする必要があります。
people[i]->name
または、同等に、(*people[i]).name
.
についても同様people[i]->age
です。main()
これを inと insideの両方で変更することを忘れないでくださいinsert
。
また、よほどの理由がない限り、変数を使用i
するinsert
代わりに に渡すことを検討してください。static
静的変数は内部状態を持つ関数に使用されますが、私にとっては、insert
それが必要なタイプの関数ではありません。