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 N+10, 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>
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 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;
}

Exercícios relacionados