C 言語で構造体の配列を初期化する
胡金庫
2023年10月12日
この記事では、C 言語で struct
の配列を初期化する方法について、複数の方法を紹介します。
C 言語でリスト記法を使って構造体の配列を初期化する
構造体は通常複数のメンバからなる派生データ型です。構造体の定義ではメンバの宣言順序が重要であり、初期化リストを用いる場合も同じ順序に従うことに注意してほしい。以下の例では、Person
という名前の struct
を定義し、この構造体には 2つの char
配列、int
、bool
が含まれています。したがって、Person
構造体の配列を宣言し、単一データ型の配列と同様に中括弧付きリストで初期化します。そして、初期化した配列の要素を for
ループを使って出力します。ただし、char
配列は %s
形式の指定子を使って出力されることに注意してください。
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Person {
char firstname[40];
char lastname[40];
int age;
bool alive;
} Person;
int printPerson(Person *p) {
if (p == NULL) return -1;
printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", p->firstname, p->lastname,
p->age);
p->alive ? printf("Yes\n") : printf("No\n");
return 0;
}
int main(void) {
Person arr[] = {
{"John\0", "McCarthy\0", 24, 1},
{"John\0", "Kain\0", 27, 1},
};
size_t size = sizeof arr / sizeof arr[0];
for (int i = 0; i < size; ++i) {
printPerson(&arr[i]);
printf("\n");
}
exit(EXIT_SUCCESS);
}
出力:
Name: John
Last Name: McCarthy
Age: 24
Alive: Yes
Name: John
Last Name: Kain
Age: 27
Alive: Yes
別の関数とループを使って C 言語の構造体の配列を初期化する
先ほどの方法の欠点は、配列をハードコードされた値で初期化したり、必要な配列が大きくなればなるほど初期化文が大きくなってしまうことです。そこで、struct
要素の初期化関数を 1つ実装して、それを反復から呼び出して struct
配列を行うようにすればよいのです。なお、initPerson
関数は struct
のすべてのメンバの値を引数に取り、パラメータとして同じく渡された Person
オブジェクトに代入します。最後に、printPerson
関数を用いて配列の各要素をコンソールに出力します。同じ Person
値を初期化関数に渡していることに注意してください。
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Person {
char firstname[40];
char lastname[40];
int age;
bool alive;
} Person;
int printPerson(Person *p) {
if (p == NULL) return -1;
printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", p->firstname, p->lastname,
p->age);
p->alive ? printf("Yes\n") : printf("No\n");
return 0;
}
int initPerson(Person *p, char *fn, char *ln, int age, bool alive) {
if (p == NULL) return -1;
memmove(&p->firstname, fn, strlen(fn) + 1);
memmove(&p->lastname, ln, strlen(ln) + 1);
p->age = age;
p->alive = alive;
return 0;
}
enum { LENGTH = 10 };
int main(void) {
Person me = {"John\0", "McCarthy\0", 24, 1};
Person arr[LENGTH];
for (int i = 0; i < LENGTH; ++i) {
initPerson(&arr[i], me.firstname, me.lastname, me.age, me.alive);
}
for (int i = 0; i < LENGTH; ++i) {
printPerson(&arr[i]);
printf("\n");
}
exit(EXIT_SUCCESS);
}
出力:
Name: John
Last Name: McCarthy
Age: 24
Alive: Yes
Name: John
Last Name: Kain
Age: 27
Alive: Yes
...
著者: 胡金庫