logotipo Blog Giovani Da Cruz
C / C++

Estruturas e alocação dinâmica em C

6 min de leitura 151 visualizações

Estruturas e Alocação Dinâmica em C

A linguagem de programação C é conhecida por sua flexibilidade e poder, especialmente quando se trata de manipulação de memória. Um dos conceitos fundamentais para quem deseja otimizar o uso da memória e melhorar o desempenho de seus programas é o uso de estruturas e alocação dinâmica de memória. Neste artigo, vamos explorar como esses dois conceitos funcionam, como utilizá-los e exemplos práticos que demonstram suas aplicações.

 

O que são Estruturas em C?

Em C, uma estrutura (ou struct) é um tipo de dado que permite agrupar diferentes tipos de variáveis em uma única entidade. Isso é extremamente útil para representar objetos do mundo real que possuem múltiplos atributos.

 

Definindo uma Estrutura

Para criar uma estrutura, utilizamos a palavra-chave struct, seguida pelo nome da estrutura e os campos que ela contém:

/* Criado pelo Professor Giovani Da Cruz */

#include <stdio.h>

struct Pessoa {
    char nome[50];
    int idade;
    float altura;
};

Neste exemplo, criamos uma estrutura chamada Pessoa, que contém três campos: nome, idade e altura. Agora, podemos criar variáveis desse tipo para armazenar as informações de diferentes pessoas:

/* Criado pelo Professor Giovani Da Cruz */

struct Pessoa pessoa1;

pessoa1.idade = 25;
pessoa1.altura = 1.75;
strcpy(pessoa1.nome, "Giovani");

Acessando Estruturas

Os campos de uma estrutura podem ser acessados utilizando o operador de ponto (.), como no exemplo acima, onde atribuimos valores aos atributos de pessoa1.

 

Alocação Dinâmica de Memória

A alocação dinâmica de memória em C permite que o programa reserve memória em tempo de execução, em vez de alocar memória estaticamente durante a compilação. Isso é especialmente útil quando não sabemos o tamanho dos dados com antecedência, como quando estamos lidando com entradas de usuários ou trabalhando com grandes quantidades de dados.

 

Funções de Alocação

As principais funções para alocação dinâmica em C são:

  • malloc(): Aloca um bloco de memória de tamanho especificado em bytes.
  • calloc(): Aloca e inicializa um bloco de memória para múltiplos elementos.
  • realloc(): Realoca um bloco de memória já alocado, ajustando seu tamanho.
  • free(): Libera um bloco de memória alocado.

 

Exemplo de Alocação com malloc

Vamos ver um exemplo de alocação dinâmica de uma estrutura Pessoa usando malloc():

/* Criado pelo Professor Giovani Da Cruz */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Pessoa {
    char nome[50];
    int idade;
    float altura;
};

int main() {
    struct Pessoa *pessoaPtr;

    // Alocando memória para uma estrutura Pessoa
    pessoaPtr = (struct Pessoa *)malloc(sizeof(struct Pessoa));

    if (pessoaPtr == NULL) {
        printf("Erro ao alocar memória\n");
        return 1;
    }

    // Atribuindo valores
    pessoaPtr->idade = 30;
    pessoaPtr->altura = 1.80;
    strcpy(pessoaPtr->nome, "Carlos");

    // Exibindo valores
    printf("Nome: %s\n", pessoaPtr->nome);
    printf("Idade: %d\n", pessoaPtr->idade);
    printf("Altura: %.2f\n", pessoaPtr->altura);

    // Liberando a memória alocada
    free(pessoaPtr);

    return 0;
}

Neste exemplo, utilizamos malloc() para alocar memória suficiente para armazenar uma estrutura Pessoa. Após o uso, a função free() libera a memória para evitar vazamentos.

 

 

Estruturas e Alocação Dinâmica com Arrays

Uma aplicação prática de estruturas e alocação dinâmica é em arrays de estruturas. Isso é útil quando precisamos manipular um número variável de objetos.

 

Exemplo de Array Dinâmico de Estruturas

Imagine que precisamos armazenar informações de várias pessoas, mas o número de pessoas só será conhecido em tempo de execução:

/* Criado pelo Professor Giovani Da Cruz */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Pessoa {
    char nome[50];
    int idade;
    float altura;
};

int main() {
    int n;
    struct Pessoa *pessoas;

    // Obtendo o número de pessoas
    printf("Quantas pessoas deseja registrar? ");
    scanf("%d", &n);

    // Alocando memória para n pessoas
    pessoas = (struct Pessoa *)malloc(n * sizeof(struct Pessoa));

    if (pessoas == NULL) {
        printf("Erro ao alocar memória\n");
        return 1;
    }

    // Inserindo os dados
    for (int i = 0; i < n; i++) {
        printf("Informe o nome da pessoa %d: ", i + 1);
        scanf("%s", pessoas[i].nome);
        printf("Informe a idade da pessoa %d: ", i + 1);
        scanf("%d", &pessoas[i].idade);
        printf("Informe a altura da pessoa %d: ", i + 1);
        scanf("%f", &pessoas[i].altura);
    }

    // Exibindo os dados
    for (int i = 0; i < n; i++) {
        printf("\nPessoa %d:\n", i + 1);
        printf("Nome: %s\n", pessoas[i].nome);
        printf("Idade: %d\n", pessoas[i].idade);
        printf("Altura: %.2f\n", pessoas[i].altura);
    }

    // Liberando memória
    free(pessoas);

    return 0;
}

Neste exemplo, o número de pessoas é obtido do usuário, e alocamos memória dinamicamente para armazenar essas informações. Isso permite uma grande flexibilidade na manipulação de dados em tempo de execução.

 

Conclusão

As estruturas e a alocação dinâmica de memória são ferramentas poderosas em C, que oferecem flexibilidade e eficiência na manipulação de dados. Ao compreender esses conceitos e aplicá-los corretamente, podemos criar programas que otimizam o uso da memória e permitem manipular dados de forma eficiente, adaptando-se às necessidades em tempo de execução.

Essas técnicas são amplamente utilizadas em aplicações que exigem alto desempenho e controle detalhado da memória, como sistemas embarcados, software de baixo nível e aplicações de tempo real. Portanto, dominar essas práticas é essencial para qualquer desenvolvedor que trabalha com a linguagem C.

 

 

Gostou do conteúdo? Deixe seu comentário e compartilhe sua experiência com estruturas e alocação dinâmica em C! Sua opinião é muito importante para enriquecer a discussão. 💬

Obrigado por acompanhar até aqui! Se você se interessou por esse tema, não deixe de conferir outros posts relacionados no blog, como “Manipulação de Ponteiros em C” e “Dicas para Otimização de Código em C”. Continue explorando e aperfeiçoando suas habilidades em programação! 🚀

Também tens os post relacionados aqui em baixo. 👇

 

 

Um abraço!

 

#ProgramaçãoC

#Desenvolvimento

#AlocaçãoDinâmica

#Memória

#Tech

#GiovaniDaCruz

Deixe um comentário

Seu e-mail não será publicado.