Ir ao conteúdo
  • Cadastre-se

Alimentar um vetor de tamanho dinâmico.


ronald94

Posts recomendados

Primeiramente boa noite. Estou tendo problemas para criar vetor de tamanho definido por valor inserido em uma variável. Quando defino o vetor com tamanho 6 ele imprime corretamente mas se digo que o valor terá 7 ou mais elementos ele não aceita. Só executa até a sexta posição. E o segundo vetor que tem que seria para exibir os elementos só exibe a 1º posição. Essa é a dúvida.. 

 

 

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

int main (){
    
    setlocale (LC_ALL, "Portuguese");
    int TamanhoDoVetor;
    int vetor[TamanhoDoVetor];
    
    
    printf("Quantos elementos tem o Vetor? ");
    scanf("%d", &TamanhoDoVetor);
    
    for (int i = 0 ; i < TamanhoDoVetor ; i++){
        printf("Diga o %dº elemento: ", i+1);
        scanf("%d", &vetor);
    }
    for (int i = 0 ; i < TamanhoDoVetor ; i++){
        printf("\n%d = %d", i+1, vetor);
    }
    
    return 0;
}
 

 

 

Link para o comentário
Compartilhar em outros sites

Essa forma de reservar memória é errônea. Analizemos um treixo do seu código...

    int TamanhoDoVetor;
    int vetor[TamanhoDoVetor];
    
    
    printf("Quantos elementos tem o Vetor? ");
    scanf("%d", &TamanhoDoVetor);

quando você declarou int TamanhoDoVetor;, que tamanho ele tem?
Para complicar a coisa... Que tamanho toma o int vetor[TamanhoDoVetor]; na hora de declarar se você nem sabe o tamanho que tem a variável TamanhoDoVetor?

você tenta pedir ao usuário o tamanho do vetor logo depois de ter declarado o vetor, isso o compilador interpreta como erro, pois o vetor ja tomou um tamanho, só que tomou um tamanho desconhecido, pois quando você reservou a variável TamanhoDoVetor essa tomou um valor de lixo que continha nessa parte da memória, então nessa parte poderia conter 0, ou 10, ou 324, ou 13141414, não se sabe, pode até mesmo conter nulos que em todo caso seria um bonito vetor de tamanho zero >_<. Por isso em programação é muito importante você dar um valor inicial a uma variável, nem que esse valor seja zero.

Seu programa pode funcionar perfeitamente si o fizesse:
 

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

int main (){
    
    setlocale (LC_ALL, "Portuguese");
    int TamanhoDoVetor;
    
    printf("Quantos elementos tem o Vetor? ");
    scanf("%d", &TamanhoDoVetor);
    
    int vetor[TamanhoDoVetor];
    
    for (int i = 0 ; i < TamanhoDoVetor ; i++){
        printf("Diga o %dº elemento: ", i+1);
        scanf("%d", &vetor[i]);
    }
    for (int i = 0 ; i < TamanhoDoVetor ; i++){
        printf("\n%d = %d", i+1, vetor[i]);
    }
    
    return 0;
}

Como você pode apreciar primeiro peço o valor de TamanhoDoVetor, e depois declaro o vetor uma vez que ja sei o tamanho que vai ter.

MAS UMA PARTE MUITO IMPORTANTE É QUE ISSO TUDO QUE EU FALEI TA ERRADO HUHEUHEUHE
O nome disso que você esta perguntando se chama vetor dinâmico. Para declarar um vetor dinâmico você precisa usar malloc, pois a forma que você propõe não é padrão em C, é muito mal vista por programadores mais veteranos, a continuação passo a lhe comentar como fazer para reservar um vetor dinâmico.

Veja esse código:
 

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

int main (){
    
    setlocale (LC_ALL, "Portuguese");
    int tam; // mais facil que TamanhoDoVetor -_-'
    int *vetor = 0; //esse será nosso vetor
    
    printf("Quantos elementos tem o Vetor? ");
    scanf("%d", &tam);
    
    
    //forma correta e padrao de reservar um vetor dinamico
    vetor = (int*) malloc( sizeof(int*) * tam );

    for (int i = 0 ; i < tam ; i++){
        printf("Diga o %dº elemento: ", i+1);
        scanf("%d", &vetor[i]);
    }
    for (int i = 0 ; i < tam ; i++){
        printf("\n%d = %d", i+1, vetor[i]);
    }
    
    free(vetor); // muito importante liberar a memoria reservada com maloc pois essa nao se libera só.
    return 0;
}

Bem.. como você pode apreciar temos um ponteiro e uma variável para definir o tamanho do vetor, primeiro pedimos o tamanho que vai ter o vetor com o scanf (...&tam), e depois usamos malloc para reservar memória:
 

vetor = (int*) malloc( sizeof(int*) * tam );

O primeiro a explicar é que malloc reserva memória na free storage e não na pilha, pois a pilha se não me engano tem um tamanho de uns 2 megabytes dependendo do compilador que uses. Na free storage você pode reservar pedaços de memória realmente grandes, você pode até mesmo reservar "tudo" huehueh, olho com isso hein. Segundo ponto a esclarecer é que a função malloc recebe por parâmetro o valor do que seria o tamanho do vetor, porém esse valor deve ser em bytes, como sabemos que um char ocupa 1 byte, si vamos reservar 10 chars simplesmente passamos o numero 10 e tudo certo, porém nao se trata de um vetor de chars e sim de um vetor de inteiros, cada inteiro ocupa o tamanho de 4 chars, ou seja um byte ocupa 1 e um char ocupa 4 bytes(pode variar de um compilador a outro), ai é onde entra a funçao sizeof() que nos retorna o valor de um tipo de dado em bytes que ocuparia na memória, si invocamos sizeof(int*) isso equivale a um 4 pois um ponteiro a inteiro tem o mesmo tamanho de um inteiro, em outras palavras int == int*, ambos tem o tamanho de 4 bytes, então quando passo sizeof(int*) * tam para malloc, si tam vale 10 que deveríamos haver recebido por teclado previamente, esse treixo sizeof(int*) * tam se traduz a 4*10, que seria como dizer ao sistema operativo através de malloc... Hey windows! Me reserva na free storage um espaço de 4bytes multiplicado por 10, que são 10 inteiros resumindo. Fácil não?
Por outra parte a penúltima coisa a destacar é que malloc retorna a direção de memória onde o vetor inicia na free storage, por isso precisamos de um ponteiro, porém malloc retorna um ponteiro a void que é um tipo de ponteiro genérico, pois malloc não sabe se queremos reservar chars, ints ou outra coisa, por isso ele retorna void, em outra palavras malloc ta declarado mais ou menos tal como (void) malloc ( int tmanaho );, por esse motivo devemos converte-lo em (int)malloc(...), ou int*, pois vetor é int* e malloc deve retornar o mesmo tipo, porém funciona igualmente "casteando" com int ou int*.

Por ultimo somente dizer que qualquer memória que for reservada na free storage vai permanecer para sempre até que desligamos o computador ou que a liberemos com a função free e passemos o ponteiro a essa função.

E ja suando muito de escrever, espero que você tenha entendido como funciona pois essa é a forma 100% correta de reservar memória dinâmica em C, fazer outra coisa é fazer gambiarra, pode falhar e certamente vai te baixar nota se for fazer um exame. Se chegasse um programador na minha empresa e eu for contratar esse programador, se ele fazer reserva de memória sem usar malloc na entrevista de trabalho mando ele pra casa huehuehuhe

 

Sorte!

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...