Inizializza array di strutture in C
- Usa la notazione lista per inizializzare l’array di strutture in C
- Utilizzare una funzione e un bucle separati per inizializzare 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
...
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