C 言語で構造体を初期化する
胡金庫
2023年10月12日
この記事では、C 言語で構造体を初期化する方法について複数の方法を紹介します。
イニシャライザリストスタイル記法を使って C 言語で構造体を初期化する
これは、members
と呼ばれる複数の異種要素を格納できる組み込みオブジェクトです。
構造体は struct
キーワードだけで定義されていますが、以下の例では typedef
を追加して新しい型名を作成し、後続の宣言をより読みやすくしています。
構造体が定義されると、この型の変数を宣言し、リスト記法で初期化することができます。この構文は、C++ で使用されるイニシャライザ・リストに似ています。この場合、struct
の各メンバを明示的な代入演算子で代入しますが、値は正しい順序でしか指定できません。
#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 main(void) {
Person me = {
.firstname = "John\0", .lastname = "McCarthy\0", .age = 24, .alive = 1};
printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", me.firstname, me.lastname,
me.age);
me.alive ? printf("Yes\n") : printf("No\n");
exit(EXIT_SUCCESS);
}
出力:
Name: John
Last Name: McCarthy
Age: 24
Alive: Yes
C で割り当てリスト表記を使用して構造体を初期化する
あるいは、宣言された struct
がすぐには初期化されず、プログラムの後半で値を代入する必要があるというシナリオもあるかもしれません。この場合、初期化リストスタイルの構文にキャスト記法を付加したものを接頭辞として用いるべきです。この struct
の型へのキャストは、プログラムをコンパイルするために必要なステップです。
#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 main(void) {
Person me;
me = (Person){
.firstname = "John\0", .lastname = "McCarthy\0", .age = 24, .alive = 1};
printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", me.firstname, me.lastname,
me.age);
me.alive ? printf("Yes\n") : printf("No\n");
exit(EXIT_SUCCESS);
}
出力:
Name: John
Last Name: McCarthy
Age: 24
Alive: Yes
C で個別の割り当てを使用して構造体を初期化する
構造体のメンバを初期化するもう一つの方法は、変数を宣言して、各メンバに対応する値を個別に割り当てることです。char
配列は文字列で割り当てるできないので、memcpy
や memove
などの追加関数を使って明示的にコピーする必要があることに注意してください ( マニュアルを参照してください)。また、array
の長さは格納される文字列よりも短くならないように常に注意しなければなりません。
#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 main(void) {
Person me2;
memcpy(&me2.firstname, "Jane\0", 40);
memcpy(&me2.lastname, "Delaney\0", 40);
me2.age = 27;
me2.alive = true;
printf("Name: %s\nLast Name: %s\nAge: %d\nAlive: ", me2.firstname,
me2.lastname, me2.age);
me2.alive ? printf("Yes\n") : printf("No\n");
exit(EXIT_SUCCESS);
}
出力:
Name: Jane
Last Name: Delaney
Age: 27
Alive: Yes
著者: 胡金庫