Initialisieren einer struct in C

Jinku Hu 12 Oktober 2023
  1. Initialisierungslisten-Stil-Notation verwenden, um eine struct in C zu initialisieren
  2. Verwenden der Zuweisungslisten-Notation zum Initialisieren einer Struktur in C
  3. Einzelzuweisung zur Initialisierung einer Struktur in C verwenden
Initialisieren einer struct in C

Dieser Artikel stellt mehrere Methoden vor, wie eine struct in C initialisiert werden kann.

Initialisierungslisten-Stil-Notation verwenden, um eine struct in C zu initialisieren

struct ist wahrscheinlich das wichtigste Schlüsselwort für den Aufbau komplexer Datenstrukturen in C. Es handelt sich um ein eingebautes Objekt, das mehrere heterogene Elemente, die sogenannten Member, speichern kann.

Beachten Sie, dass Strukturen nur mit dem Schlüsselwort struct definiert werden, aber in den folgenden Beispielen fügen wir typedef hinzu, um einen neuen Typnamen zu erzeugen und die nachfolgenden Deklarationen lesbarer zu machen.

Sobald die Struktur definiert ist, können wir eine Variable dieses Typs deklarieren und sie mit der Listenschreibweise initialisieren. Diese Syntax ist ähnlich der in C++ verwendeten Initialisierungsliste. In diesem Fall weisen wir jedes Mitglied der struct mit einem expliziten Zuweisungsoperator zu, aber wir können nur Werte in der richtigen Reihenfolge angeben, und das wäre in modernen Versionen der Sprache ausreichend.

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

Ausgabe:

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

Verwenden der Zuweisungslisten-Notation zum Initialisieren einer Struktur in C

Alternativ könnte es ein Szenario geben, in dem eine deklarierte struct nicht sofort initialisiert wird und später im Programm Werte zugewiesen werden müssen. In diesem Fall sollten wir die Syntax im Stil der Initialisierungsliste mit einer zusätzlichen Cast-Notation als Präfix verwenden. Das Casting auf den Typ des struct ist der notwendige Schritt, um das Programm zu kompilieren.

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

Ausgabe:

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

Einzelzuweisung zur Initialisierung einer Struktur in C verwenden

Eine andere Methode, um struct-Mitglieder zu initialisieren, besteht darin, eine Variable zu deklarieren und dann jedem Mitglied den entsprechenden Wert separat zuzuweisen. Beachten Sie, dass char-Arrays nicht mit string zugewiesen werden können, so dass sie explizit mit zusätzlichen Funktionen wie memcpy oder memmove kopiert werden müssen (siehe Handbuch). Sie sollten immer darauf achten, dass die Länge des Arrays nicht kleiner sein darf als der zu speichernde String.

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

Ausgabe:

Name: Jane
Last Name: Delaney
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