Aprendendo malloc() e calloc() em C

A alocação dinâmica de memória permite que um programa reserve espaço durante sua execução. Esse recurso é útil quando a quantidade de dados que será armazenada não é conhecida antes de o programa começar.

Na linguagem C, as funções malloc() e calloc() são utilizadas para reservar memória dinamicamente. A função malloc() reserva um bloco de memória sem inicializar seus valores, enquanto calloc() reserva o espaço e inicializa todos os bytes com zero.

Neste conteúdo, você irá praticar a criação de arrays dinâmicos, o armazenamento de dados, o cálculo de médias, o registro de votos e a liberação correta da memória com free().

Questão 1 — Criar um array com malloc()

Crie um programa em C que:

  • peça ao usuário a quantidade de números que deseja armazenar;
  • reserve memória dinamicamente com malloc();
  • preencha o array com os valores 10, 20, 30, 40...;
  • mostre todos os valores;
  • libere a memória no final.
Exemplo:
				
					Digite a quantidade de numeros: 5

Valores armazenados:
10 20 30 40 50
				
			
Resposta:
				
					#include <stdio.h>
#include <stdlib.h>

int main() {

    int quantidade;
    int *numeros;

    printf("Digite a quantidade de numeros: ");
    scanf("%d", &quantidade);

    if (quantidade <= 0) {
        printf("Quantidade invalida.\n");
        return 1;
    }

    numeros = malloc(quantidade * sizeof(int));

    if (numeros == NULL) {
        printf("Erro ao reservar memoria.\n");
        return 1;
    }

    for (int i = 0; i < quantidade; i++) {
        numeros[i] = (i + 1) * 10;
    }

    printf("\nValores armazenados:\n");

    for (int i = 0; i < quantidade; i++) {
        printf("%d ", numeros[i]);
    }

    printf("\n");

    free(numeros);
    numeros = NULL;

    return 0;
}
				
			

Questão 2 — Receber valores do usuário com malloc()

Crie um programa em C que:

  • peça ao usuário a quantidade de notas;
  • reserve memória dinamicamente com malloc();
  • permita que o usuário digite cada nota;
  • calcule e mostre a média das notas;
  • libere a memória no final.
Exemplo:
				
					Digite a quantidade de notas: 4

Digite a nota 1: 7.5
Digite a nota 2: 8.0
Digite a nota 3: 9.0
Digite a nota 4: 6.5

Media: 7.75
				
			
Resposta:
				
					#include <stdio.h>
#include <stdlib.h>

int main() {

    int quantidade;
    float *notas;
    float soma = 0;
    float media;

    printf("Digite a quantidade de notas: ");
    scanf("%d", &quantidade);

    if (quantidade <= 0) {
        printf("Quantidade invalida.\n");
        return 1;
    }

    notas = malloc(quantidade * sizeof(float));

    if (notas == NULL) {
        printf("Erro ao reservar memoria.\n");
        return 1;
    }

    for (int i = 0; i < quantidade; i++) {

        printf("Digite a nota %d: ", i + 1);
        scanf("%f", &notas[i]);

        soma = soma + notas[i];
    }

    media = soma / quantidade;

    printf("\nMedia: %.2f\n", media);

    free(notas);
    notas = NULL;

    return 0;
}
				
			

Questão 3 — Contador de votos com calloc()

Crie um programa em C que:

  • peça a quantidade de candidatos;
  • crie dinamicamente um array de votos usando calloc();
  • mostre os votos iniciais de todos os candidatos;
  • considere que todos começam com zero votos;
  • libere a memória no final.
Exemplo:
				
					Digite a quantidade de candidatos: 3

Votos iniciais:
Candidato 1: 0 votos
Candidato 2: 0 votos
Candidato 3: 0 votos
				
			
Resposta:
				
					#include <stdio.h>
#include <stdlib.h>

int main() {

    int quantidade;
    int *votos;

    printf("Digite a quantidade de candidatos: ");
    scanf("%d", &quantidade);

    if (quantidade <= 0) {
        printf("Quantidade invalida.\n");
        return 1;
    }

    votos = calloc(quantidade, sizeof(int));

    if (votos == NULL) {
        printf("Erro ao reservar memoria.\n");
        return 1;
    }

    printf("\nVotos iniciais:\n");

    for (int i = 0; i < quantidade; i++) {
        printf("Candidato %d: %d votos\n", i + 1, votos[i]);
    }

    free(votos);
    votos = NULL;

    return 0;
}
				
			

Questão 4 — Registrar votos com calloc()

Crie um programa em C que:

  • peça a quantidade de candidatos;
  • crie um array de votos com calloc();
  • peça a quantidade de votos que serão registrados;
  • para cada voto, peça o número do candidato;
  • aumente em 1 a quantidade de votos do candidato escolhido;
  • mostre o resultado final;
  • libere a memória corretamente.

Considere que os candidatos são numerados a partir de 1.

Exemplo:
				
					Digite a quantidade de candidatos: 3
Digite a quantidade de votos: 5

Digite o candidato do voto 1: 1
Digite o candidato do voto 2: 2
Digite o candidato do voto 3: 1
Digite o candidato do voto 4: 3
Digite o candidato do voto 5: 1

Resultado:
Candidato 1: 3 votos
Candidato 2: 1 votos
Candidato 3: 1 votos
				
			
Resposta:
				
					#include <stdio.h>
#include <stdlib.h>

int main() {

    int quantidadeCandidatos;
    int quantidadeVotos;
    int candidato;
    int *votos;

    printf("Digite a quantidade de candidatos: ");
    scanf("%d", &quantidadeCandidatos);

    if (quantidadeCandidatos <= 0) {
        printf("Quantidade invalida.\n");
        return 1;
    }

    votos = calloc(quantidadeCandidatos, sizeof(int));

    if (votos == NULL) {
        printf("Erro ao reservar memoria.\n");
        return 1;
    }

    printf("Digite a quantidade de votos: ");
    scanf("%d", &quantidadeVotos);

    if (quantidadeVotos < 0) {
        printf("Quantidade de votos invalida.\n");

        free(votos);
        votos = NULL;

        return 1;
    }

    for (int i = 0; i < quantidadeVotos; i++) {

        printf("Digite o candidato do voto %d: ", i + 1);
        scanf("%d", &candidato);

        if (candidato >= 1 && candidato <= quantidadeCandidatos) {
            votos[candidato - 1]++;
        } else {
            printf("Candidato invalido.\n");
            i--;
        }
    }

    printf("\nResultado:\n");

    for (int i = 0; i < quantidadeCandidatos; i++) {
        printf("Candidato %d: %d votos\n", i + 1, votos[i]);
    }

    free(votos);
    votos = NULL;

    return 0;
}
				
			

Questão 5 — Comparar malloc() e calloc()

Crie um programa em C que:

  • peça ao usuário a quantidade de posições;
  • crie um array com malloc();
  • crie outro array com calloc();
  • preencha o array criado com malloc() com valores múltiplos de 5;
  • mostre os valores do array criado com malloc();
  • mostre os valores iniciais do array criado com calloc();
  • libere os dois blocos de memória.
Exemplo:
				
					Digite a quantidade de posicoes: 4

Array com malloc:
5 10 15 20

Array com calloc:
0 0 0 0
				
			
Resposta:
				
					#include <stdio.h>
#include <stdlib.h>

int main() {

    int quantidade;
    int *arrayMalloc;
    int *arrayCalloc;

    printf("Digite a quantidade de posicoes: ");
    scanf("%d", &quantidade);

    if (quantidade <= 0) {
        printf("Quantidade invalida.\n");
        return 1;
    }

    arrayMalloc = malloc(quantidade * sizeof(int));
    arrayCalloc = calloc(quantidade, sizeof(int));

    if (arrayMalloc == NULL || arrayCalloc == NULL) {

        printf("Erro ao reservar memoria.\n");

        free(arrayMalloc);
        free(arrayCalloc);

        return 1;
    }

    for (int i = 0; i < quantidade; i++) {
        arrayMalloc[i] = (i + 1) * 5;
    }

    printf("\nArray com malloc:\n");

    for (int i = 0; i < quantidade; i++) {
        printf("%d ", arrayMalloc[i]);
    }

    printf("\n\nArray com calloc:\n");

    for (int i = 0; i < quantidade; i++) {
        printf("%d ", arrayCalloc[i]);
    }

    printf("\n");

    free(arrayMalloc);
    arrayMalloc = NULL;

    free(arrayCalloc);
    arrayCalloc = NULL;

    return 0;
}
				
			

Caso o C ainda não esteja instalado em seu dispositivo, clique no botão abaixo para realizar a instalação.

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *