Faça um programa que leia números do teclado e os armazene em um vetor alocado dinamicamente. O usuário irá digitar uma sequência de números, sem limite de quantidade. Os números serão digitados um a um e, sendo que caso ele deseje encerrar a entrada de dados, ele ira digitar o número ZERO. Os dados devem ser armazenados na memória deste modo
- Inicie com um vetor de tamanho 10 alocado dinamicamente;
- Após, caso o vetor alocado esteja cheio, aloque um novo vetor do tamanho do vetor anterior adicionado espaço para mais 10 valores (tamanho
, onde N inicia com 10);
- Copie os valores já digitados da área inicial para esta área maior e libere a memória da área inicial;
- Repita este procedimento de expandir dinamicamente com mais 10 valores o vetor alocado cada vez que o mesmo estiver cheio. Assim o vetor irá ser ‘expandido’ de 10 em 10 valores.
Ao final, exiba o vetor lido. Não use a função REALLOC.
Passo 1
Neste exercício, vamos criar um programa em C que lê uma sequência de inteiros do teclado até o usuário digitar zero, armazena esses valores num vetor alocado dinamicamente e, sempre que o vetor ficar cheio, expande sua capacidade em mais 10 posições, copiando os valores antigos e liberando a memória anterior. O conteúdo envolve alocação dinâmica de memória com malloc e free, manipulação de ponteiros e cópia de blocos de memória manualmente (sem usar realloc).
Passo 2
Começamos declarando variáveis de controle: um ponteiro para int que vai apontar para o nosso vetor, uma variável que guarda o tamanho atual do vetor (inicialmente 10) e outra que conta quantos elementos já armazenamos (inicialmente zero). Em seguida, usamos malloc para reservar memória suficiente para 10 inteiros e verificamos se a alocação foi bem-sucedida.
Passo 3
Implementamos um loop de leitura que repete: lê um número pelo scanf, verifica se é zero (caso em que saímos do loop) e, se não for, checa se já atingimos a capacidade do vetor. Se o vetor estiver cheio (count == size), alocamos um novo bloco de memória com tamanho original + 10, copiamos elemento a elemento do vetor antigo para o novo, liberamos o vetor antigo com free, atualizamos o ponteiro e a variável size.
Passo 4
Após garantir espaço, armazenamos o número lido na próxima posição livre do vetor (array[count]) e incrementamos count. Esse processo se repete até o usuário digitar zero.
Passo 5
Quando a entrada de dados termina, fazemos um loop simples para imprimir todos os elementos válidos do vetor (de índice 0 até count-1). Por fim, liberamos a memória alocada usando free antes de terminar o programa.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
int main(void) {
int size = 10;
int count = 0;
int *array = malloc(size * sizeof(int));
if (array == NULL) {
fprintf(stderr, “Erro na alocação de memória\n”);
return 1;
}
int size = 10;
int count = 0;
int *array = malloc(size * sizeof(int));
if (array == NULL) {
fprintf(stderr, “Erro na alocação de memória\n”);
return 1;
}
int num;
printf("Digite números (0 para encerrar):\n");
while (1) {
if (scanf("%d", &num) != 1) {
fprintf(stderr, "Erro de leitura\n");
free(array);
return 1;
}
if (num == 0) {
break;
}
if (count == size) {
int new_size = size + 10;
int *new_array = malloc(new_size * sizeof(int));
if (new_array == NULL) {
fprintf(stderr, "Erro na alocação de memória\n");
free(array);
return 1;
}
for (int i = 0; i < count; i++) {
new_array[i] = array[i];
}
free(array);
array = new_array;
size = new_size;
}
array[count++] = num;
}
printf("Valores lidos:\n");
for (int i = 0; i < count; i++) {
printf("%d ", array[i]);
}
printf("\n");
free(array);
return 0;
}