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
#include
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
#include
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", ¬as[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
#include
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
1a 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
#include
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 de5; - 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
#include
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.





