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

胡金庫 2023年10月12日
  1. C 言語でリスト記法を使って構造体の配列を初期化する
  2. 別の関数とループを使って C 言語の構造体の配列を初期化する
C 言語で構造体の配列を初期化する

この記事では、C 言語で struct の配列を初期化する方法について、複数の方法を紹介します。

C 言語でリスト記法を使って構造体の配列を初期化する

構造体は通常複数のメンバからなる派生データ型です。構造体の定義ではメンバの宣言順序が重要であり、初期化リストを用いる場合も同じ順序に従うことに注意してほしい。以下の例では、Person という名前の struct を定義し、この構造体には 2つの char 配列、intbool が含まれています。したがって、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

...
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C Struct