Inicializar Array de Structs em C

Jinku Hu 12 outubro 2023
  1. Use a notação de lista para inicializar a matriz de estruturas em C
  2. Use uma função separada e um loop para inicializar a matriz de estruturas em C
Inicializar Array de Structs em C

Este artigo irá demonstrar vários métodos sobre como inicializar un array de struct s em C.

Use a notação de lista para inicializar a matriz de estruturas em C

Estruturas são tipos de dados derivados que geralmente consistem em vários membros. Observe que a ordem da declaração do membro na definição de struct é importante e, quando a lista de inicializadores é usada, ela segue a mesma ordem. No exemplo a seguir, definimos uma struct chamada Person, que inclui 2 arrays char, um int e um bool. Conseqüentemente, declaramos um array de estruturas Person e o inicializamos com listas entre chaves, como faríamos com o array de tipo de dados único. Em seguida, exibimos os elementos inicializados do array usando o loop for. Lembre-se, porém, que os arrays char são impressos com o especificador de formato %s, uma vez que incluímos o byte \0 em cada literal de string nas listas de inicializadores.

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

Resultado:

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

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

Use uma função separada e um loop para inicializar a matriz de estruturas em C

A desvantagem do método anterior é que o array pode ser inicializado com valores embutidos em código, ou quanto maior o array precisa ser, maior será a instrução de inicialização. Portanto, devemos implementar uma única função de inicialização de elemento struct e chamá-la da iteração para fazer o array struct. Observe que, a função initPerson leva todos os valores de membro struct como argumentos e os atribui ao objeto Person que também foi passado como um parâmetro. Finalmente, geramos cada elemento do array para o console usando a função printPerson. Observe que passamos os mesmos valores Person para a função de inicialização apenas para fins de demonstração.

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

Resultado:

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

Artigo relacionado - C Struct