C 言語で構造体を初期化する

胡金庫 2023年10月12日
  1. イニシャライザリストスタイル記法を使って C 言語で構造体を初期化する
  2. C で割り当てリスト表記を使用して構造体を初期化する
  3. C で個別の割り当てを使用して構造体を初期化する
C 言語で構造体を初期化する

この記事では、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 配列は文字列で割り当てるできないので、memcpymemove などの追加関数を使って明示的にコピーする必要があることに注意してください ( マニュアルを参照してください)。また、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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Struct