Array von Structs in C initialisieren

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Listennotation, um ein Array von Structs in C zu initialisieren
  2. Verwenden einer separaten Funktion und Schleife zum Initialisieren von Array-Strukturen in C
Array von Structs in C initialisieren

Dieser Artikel demonstriert mehrere Methoden, wie ein Array von struct in C initialisiert werden kann.

Verwenden Sie die Listennotation, um ein Array von Structs in C zu initialisieren

Strukturen sind abgeleitete Datentypen, die normalerweise aus mehreren Mitgliedern bestehen. Beachten Sie, dass die Reihenfolge der Member-Deklarationen in der struct-Definition wichtig ist, und wenn die Initialisierungsliste verwendet wird, folgt sie der gleichen Reihenfolge. Im folgenden Beispiel definieren wir ein struct namens Person, das 2 char-Arrays, ein int und ein bool enthält. Folglich deklarieren wir ein Array von Person-Strukturen und initialisieren es mit geschweiften Listen, wie wir es mit dem Array eines einzelnen Datentyps tun würden. Dann geben wir die initialisierten Array-Elemente mit Hilfe der for-Schleife aus. Beachten Sie jedoch, dass char-Arrays mit dem Formatbezeichner %s ausgegeben werden, da wir in den Initialisierungslisten in jedem String-Literal \0 Byte enthalten haben.

#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);
}

Ausgabe:

Name: John
Last Name: McCarthy
Age: 24
Alive: Yes

Name: John
Last Name: Kain
Age: 27
Alive: Yes

Verwenden einer separaten Funktion und Schleife zum Initialisieren von Array-Strukturen in C

Der Nachteil der vorherigen Methode ist, dass Arrays mit hart kodierten Werten initialisiert werden können, oder je größer das Array sein muss, desto größer wird die Initialisierungsanweisung. Daher sollten wir eine einzelne struct-Element-Initialisierungsfunktion implementieren und diese aus der Iteration heraus aufrufen, um das struct-Array zu erledigen. Beachten Sie, dass die Funktion initPerson alle struct-Elementwerte als Argumente nimmt und sie dem Objekt Person zuweist, das ebenfalls als Parameter übergeben wurde. Schließlich geben wir jedes Element des Arrays mit der Funktion printPerson auf der Konsole aus. Beachten Sie, dass wir nur zu Demonstrationszwecken dieselben Person-Werte an die Initialisierungsfunktion übergeben.

#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);
}

Ausgabe:

Name: John
Last Name: McCarthy
Age: 24
Alive: Yes

Name: John
Last Name: Kain
Age: 27
Alive: Yes

...
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C Struct