Inicializar una estructura en C

Jinku Hu 12 octubre 2023
  1. Utilizar la notación de estilo de lista inicializadora para inicializar una estructura en C
  2. Utilizar la notación de lista de asignaciones para inicializar una Struct en C
  3. Usar la Asignación Individual para Inicializar una Struct en C
Inicializar una estructura en C

Este artículo presenta varios métodos para inicializar una estructura en C.

Utilizar la notación de estilo de lista inicializadora para inicializar una estructura en C

struct es probablemente la palabra clave más importante para construir estructuras de datos complejas en C. Es un objeto incorporado que puede almacenar múltiples elementos heterogéneos llamados members.

Observa que las estructuras se definen sólo con la palabra clave struct, pero en los siguientes ejemplos, añadimos typedef para crear un nuevo nombre de tipo y hacer más legibles las declaraciones posteriores.

Una vez definida la estructura, podemos declarar una variable de este tipo e inicializarla con notación de lista. Esta sintaxis es similar a la lista inicializadora utilizada en C++. En este caso, asignamos cada miembro de la struct con un operador de asignación explícito, pero sólo podemos especificar los valores en el orden correcto, y eso sería suficiente en las versiones modernas del lenguaje.

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

Producción :

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

Utilizar la notación de lista de asignaciones para inicializar una Struct en C

Alternativamente, puede haber un escenario en el que una struct declarada no se inicialice inmediatamente y necesite que se le asignen valores más adelante en el programa. En este caso, debemos utilizar la sintaxis de inicialización estilo lista con una notación de fundición adicional como prefijo. La conversión al tipo de struct es el paso necesario para compilar el programa.

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

Producción :

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

Usar la Asignación Individual para Inicializar una Struct en C

Otro método para inicializar los miembros de la struct es declarar una variable y luego asignar a cada miembro su correspondiente valor por separado. Ten en cuenta que los Arrays char no pueden ser asignadas con string, por lo que deben ser copiadas explícitamente con funciones adicionales como memcpy o memmove (ver manual). Siempre debes tener en cuenta que la longitud del array no debe ser menor que la cadena que se almacena.

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

Producción :

Name: Jane
Last Name: Delaney
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