Inizializza array di strutture in C

Jinku Hu 12 ottobre 2023
  1. Usa la notazione lista per inizializzare l’array di strutture in C
  2. Utilizzare una funzione e un bucle separati per inizializzare array di strutture in C
Inizializza array di strutture in C

Questo articolo mostrerà diversi metodi su come inizializzare un array di struct in C.

Usa la notazione lista per inizializzare l’array di strutture in C

Le strutture sono tipi di dati derivati che in genere sono costituiti da più membri. Notare che l’ordine di dichiarazione dei membri nella definizione struct è importante e quando viene utilizzato l’lista degli inizializzatori, segue lo stesso ordine. Nell’esempio seguente, definiamo una struttura denominata Person, che include 2 array char, un int e un bool. Di conseguenza, dichiariamo un array di strutture Person e lo inizializziamo con liste di parentesi graffe come faremmo con il singolo tipo di dato array. Quindi restituiamo gli elementi dell’array inizializzati usando il cicli for. Attenzione però, gli array char vengono stampati con l’identificatore di formato %s poiché abbiamo incluso \0 byte in ogni stringa letterale negli liste degli inizializzatori.

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

Produzione:

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

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

Utilizzare una funzione e un bucle separati per inizializzare array di strutture in C

Lo svantaggio del metodo precedente è che l’array può essere inizializzato con valori hardcoded, oppure più grande deve essere l’array, maggiore sarà l’istruzione di inizializzazione. Quindi, dovremmo implementare una singola funzione di inizializzazione dell’elemento struct e chiamarla dall’iterazione per eseguire l’array struct. Notare che, la funzione initPerson accetta tutti i valori dei membri struct come argomenti e li assegna all’oggetto Person che è stato anche passato come parametro. Infine, inviamo ogni elemento dell’array alla console utilizzando la funzione printPerson. Notare che passiamo gli stessi valori Person alla funzione di inizializzazione solo a scopo dimostrativo.

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

Produzione:

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

Name: John
Last Name: Kain
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