Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Vinícius Alves

Alocação de Memória Dinamica

Recommended Posts

Fala pessoa beleza? To com esse exercício aqui pra resolver

 

1) Faça um laço de entrada de dados, onde o usuário deve digitar uma sequência de números, sem limite de quantidade de dados a ser fornecida. O usuário irá digitar os números um a um, sendo que caso ele deseje encerrar a entrada de dados, ele irá digitar o número Zero.

 

Atenção:

Os dados devem ser armazenados na memória deste modo: faça com que o programa inicie criando um ponteiro para um bloco (vetor) de 10 valores inteiros, e alocando dinamicamente espaço em memória para este bloco; logo após, caso o vetor alocado esteja cheio; aloque um novo vetor do tamanho do vetor anterior adicionado com 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.

 

#include <stdio.h>
#include <stdlib.h>
int main () {
int i;
int *p;
int num;
for(i=0;num!=0;i++) {
p= (int*) realloc(p,i*sizeof(int));
printf("Digite os numeros:\n");
scanf("%d",&num);
p=num;
}
printf("Concluido");
}

O exercício esta resolvido,mas n te acordo com o o professor pediu. Por isso to pedindo esse help aqui. Vlww

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é problema é melhor explicado demostrando um código.

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

int main() {
    // Tamanho inicial do vetor
    int tamVet = 10;
    // Primeira alocação do vetor
    int* piVetorInt = (int*)malloc(sizeof(int)*tamVet);
    if(!piVetorInt) {
        // Não foi possível alocar o novo bloco de memória
        printf("Não foi possivel alocar a memoria.");
        exit(1);
    }
    // Inicializa o novo vetor alocado
    memset(piVetorInt,0,sizeof(int)*tamVet);
    // Ponteiro para o novo vetor alocado
    int* piNovoVetor = NULL;
    // Numero digitado pelo usuario
    int iNum = 0;
    // Contador que indica a quantidade de numeros digitados
    int iCont = 0;
    // Armazena o tamanho original do vetor, utilizado para inicializa a nova regiao de memoria alocada
    int iTamOriginal = tamVet;

    do {
        printf("%s\niNum >> ", "Digite qualquer numero para adicionar ao vetor ou 0(zero) para sair.");
        scanf("%d%*c",&iNum);
        
        if(iNum == 0)
            break;
        
        // Armazena valor digitado pelo usuario
        piVetorInt[iCont++] = iNum;

        if(tamVet == iCont) {
            // Armazena tamanho original do vetor
            iTamOriginal = tamVet + 1;
            // Se vetor está cheio, realoca a memória
            tamVet += tamVet; // Novo tamanho = tamanho Atual * 2
            // Realoca nova área de memória
            piNovoVetor = (int*)realloc(piVetorInt,sizeof(int)*tamVet);
            if(!piNovoVetor) {
                // Não foi possível realocar o bloco de memória
                printf("Não foi possivel alocar novo bloxo de memoria.");
                exit(1);
            }
            piVetorInt = piNovoVetor;
            memset(&piVetorInt[iTamOriginal],0,sizeof(int)*(tamVet-iTamOriginal));
        }
    }while(1); // Loop infinito

    printf("Valores digitados pelo usuario: ");
    for(iCont = 0; piVetorInt[iCont] != 0; iCont++)
        printf("\'%d\' ",piVetorInt[iCont]);

    printf("\nDigite qualquer tecla para sair...");
    getchar();
    return 0;
}

 

Esse código dobra o tamanho do vetor a cada vez que fica cheio. Estude-o e altere de acordo com a necessidade.

 

Links:

http://www.cplusplus.com/reference/cstdlib/malloc/

http://www.cplusplus.com/reference/cstdlib/realloc/?kw=realloc

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa cara vlw msm, vc explicou bem vários conceitos q eu só sabia por auto. Vou usar o seu código como base pra muitas coisas no meu curso kkk. Estrutura de dados é tenso.

Muito obrigado!!

 

[PROBLEMA RESOLVIDO]

Compartilhar este post


Link para o post
Compartilhar em outros sites

GBecker, parabéns por não cair na armadilha de vazamento de memória com realloc. Muita gente perde o valor do ponteiro original, associando o retorno de realloc ao objeto que continha o valor antigo antes de verificar se a função retornou !0.

 

Li seu código rapidamente, e uma sugestão que tenho é usar sizeof *nome ao invés de sizeof (t *).

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Guidjos.

 

Prestei bastante atenção nos errors e warnings retornados pelo compilador, só considerei o exemplo terminado quando o compilador não retornou mais nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.