Inicializar array de estructuras en C

Jinku Hu 12 octubre 2023
  1. Use la notación de lista para inicializar un array de estructuras en C
  2. Utilice una función y un bucle separados para inicializar un array de estructuras en C
Inicializar array de estructuras en C

Este artículo demostrará varios métodos sobre cómo inicializar un array de struct en C.

Use la notación de lista para inicializar un array de estructuras en C

Las estructuras son tipos de datos derivados que normalmente constan de varios miembros. Tenga en cuenta que el orden de declaración de miembros en la definición de struct es importante, y cuando se usa la lista de inicializadores, sigue el mismo orden. En el siguiente ejemplo, definimos una struct llamada Person, que incluye 2 arrays char, un int y un bool. En consecuencia, declaramos un array de estructuras Person y la inicializamos con listas entre llaves como lo haríamos con el array de tipo de datos único. Luego generamos los elementos del array inicializados usando el bucle for. Sin embargo, tenga en cuenta que los Arrays char se imprimen con el especificador de formato %s ya que incluimos el byte \0 en cada literal de cadena en las 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);
}

Producción :

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

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

Utilice una función y un bucle separados para inicializar un array de estructuras en C

La desventaja del método anterior es que el array se puede inicializar con valores codificados, o cuanto más grande deba ser el array, mayor será la instrucción de inicialización. Por lo tanto, deberíamos implementar una única función de inicialización de elemento struct y llamarla desde la iteración para hacer el array struct. Tenga en cuenta que la función initPerson toma todos los valores del miembro struct como argumentos y los asigna al objeto Person que también se ha pasado como parámetro. Finalmente, enviamos cada elemento del array a la consola usando la función printPerson. Observe que pasamos los mismos valores de Person a la función de inicialización solo con fines de demostración.

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

Producción :

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

Artículo relacionado - C Struct