Inicializar um Struct em C

Jinku Hu 12 outubro 2023
  1. Usar a Notação de Estilo da Lista Inicializadora para Inicializar uma Estrutura em C
  2. Utilizar notação de lista de atribuição para inicializar uma estrutura em C
  3. Utilizar Atribuição Individual para Inicializar uma Estrutura em C
Inicializar um Struct em C

Este artigo irá introduzir múltiplos métodos sobre como inicializar uma estrutura em C.

Usar a Notação de Estilo da Lista Inicializadora para Inicializar uma Estrutura em C

struct é provavelmente a palavra-chave mais importante para a construção de estruturas de dados complexas em C. É um objecto incorporado que pode armazenar múltiplos elementos heterogéneos chamados membros.

Note-se que as estruturas são definidas apenas com a palavra-chave struct, mas nos exemplos seguintes, adicionamos typedef para criar um novo nome de tipo e tornar as declarações subsequentes mais legíveis.

Uma vez definida a estrutura, podemos declarar uma variável deste tipo e inicializá-la com a notação de lista. Esta sintaxe é semelhante à da lista inicializadora utilizada em C++. Neste caso, atribuímos a cada membro da struct um operador de atribuição explícita, mas só podemos especificar valores na ordem correcta, e isso seria suficiente nas versões modernas da língua.

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

Resultado:

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

Utilizar notação de lista de atribuição para inicializar uma estrutura em C

Alternativamente, pode haver um cenário em que um struct declarado não é inicializado imediatamente e precisa de ser atribuído valores mais tarde no programa. Neste caso, devemos utilizar como prefixo a sintaxe do tipo de lista de inicializadores com uma notação adicional de lista. A fundição para o tipo de struct é o passo necessário para compilar o 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);
}

Resultado:

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

Utilizar Atribuição Individual para Inicializar uma Estrutura em C

Outro método para inicializar os membros struct é declarar uma variável e depois atribuir a cada membro o seu valor correspondente separadamente. Note-se que as arrays char não podem ser atribuídas com string, pelo que precisam de ser copiadas explicitamente com funções adicionais como memcpy ou memmove (ver manual). Deve ter sempre em atenção que o comprimento da array não deve ser inferior ao da string que está a ser armazenada.

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

Resultado:

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

Artigo relacionado - C Struct