さて、「明らかに」最初に「struct Database」を入力する必要があります。
struct Database MyDatabase;
MyDatabase.data_rows=malloc(sizeof(MyDatabase.data_rows[0])*NumberOfPeople);
malloc() の失敗をチェックしなかったという事実を無視すると、これにより、すべて初期化されていない「struct Person」の配列が得られます。したがって、ほとんどの場合、それらを初期化する必要があります。
int i;
for (i=0; i<NumberOfPeople; i++)
{
struct Person* MyPerson;
MyPerson=&MyDatabase.data_rows[i];
MyPerson->id=i;
MyPerson->name=malloc(...);
/* Do something to store the name in MyPerson->name */
MyPerson->place=malloc(...);
/* Do something to store the place in MyPerson->name */
}
ここで問題になるのは、malloc に付けた "..." です。固定サイズを使用すれば簡単ですが、構造体を次のように宣言することもできます
struct Person
{
int id;
char name[100];
char place[200];
};
基本的に、名前の長さがどうあるべきかわからないので、「...」と入力しました。
また、「id」が何であるかを推測しました。配列インデックスを使用することは、実際にはやや無意味です:-)
もちろん、今すべてを行う必要はありません。名前を設定してポインターを NULL に置き、ファイルからデータを読み取るときなど、後でそれらを埋めることができます。または、どのフィールドが初期化され、どのフィールドが初期化されていないかをコードが常に「認識」していると確信している場合は、ここでまったく初期化しないこともできます。