0

数日前に C でプログラミングを始めたばかりです。私は今、構造体を学ぼうとしています。

私はこのプログラムを持っており、配列 people が構造体へのポインターの配列になるように改善したいと考えています。これを行う方法がわかりません。

また、挿入メソッドを変更して、malloc を呼び出して新しい構造体を作成し、それを指す正しい配列要素を設定したいと考えています。

私の知る限り、malloc は動的メモリ割り当てですが、いくつかのガイドを読んだことがありますが、正確な使用方法についてはまだわかりません。また、malloc を使用した後、プログラムを以前と同じように動作させるには、他に何を変更する必要がありますか?

4

1 に答える 1

1

ポインターの配列にしたい場合は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それが必要なタイプの関数ではありません。

于 2013-10-24T17:14:35.333 に答える