Inizializza uno Struct in C

Jinku Hu 12 ottobre 2023
  1. Utilizzare la notazione dello stile dell’lista di inizializzatori per inizializzare uno Struct in C
  2. Utilizzare la notazione dell’lista di assegnazioni per inizializzare uno Struct in C
  3. Usa assegnazione individuale per inizializzare uno Struct in C
Inizializza uno Struct in C

Questo articolo introdurrà più metodi su come inizializzare una struttura in C.

Utilizzare la notazione dello stile dell’lista di inizializzatori per inizializzare uno Struct in C

struct è probabilmente la parola chiave più importante per costruire strutture di dati complesse in C. È un oggetto integrato che può memorizzare più elementi eterogenei chiamati membri.

Notare che le strutture sono definite solo con la parola chiave struct, ma nei seguenti esempi, aggiungiamo typedef per creare un nuovo nome di tipo e rendere più leggibili le dichiarazioni successive.

Una volta definita la struttura, possiamo dichiarare una variabile di questo tipo e inizializzarla con la notazione di lista. Questa sintassi è simile all’lista di inizializzatori utilizzato in C++. In questo caso, assegniamo a ciascun membro della struct un operatore di assegnazione esplicito, ma possiamo solo specificare i valori nell’ordine corretto, e ciò sarebbe sufficiente nelle versioni moderne del linguaggio.

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

Produzione:

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

Utilizzare la notazione dell’lista di assegnazioni per inizializzare uno Struct in C

In alternativa, potrebbe esserci uno scenario in cui una struct dichiarata non viene inizializzata immediatamente e deve essere assegnata successivamente ai valori nel programma. In questo caso, dovremmo usare la sintassi in stile lista dell’inizializzatore con un’ulteriore notazione cast come prefisso. Il casting al tipo di struct è il passo necessario per compilare il programma.

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

Produzione:

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

Usa assegnazione individuale per inizializzare uno Struct in C

Un altro metodo per inizializzare i membri della struct consiste nel dichiarare una variabile e quindi assegnare a ciascun membro il valore corrispondente separatamente. Nota che gli array char non possono essere assegnati con string, quindi devono essere copiati esplicitamente con funzioni aggiuntive come memcpy o memmove (vedi manuale). Dovresti sempre tenere presente che la lunghezza dell’array non deve essere inferiore alla stringa memorizzata.

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

Produzione:

Name: Jane
Last Name: Delaney
Age: 27
Alive: Yes
Autore: 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

Articolo correlato - C Struct