Ir para conteúdo

POWERED BY:

Arquivado

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

Henrique Neves_44854

[Resolvido] Populando um vetor

Recommended Posts

Bom dia, estou tendo dificuldade em desenvolver uma função para preencher todo meu vetor, o código que se segue ao executar dá erro de execução após eu inserir o último elemento do vetor, alguém saberia o por quê?

 

int populaVetor (int tamanho, int vetor[]){
   int i;
   int retorno = 0;
   for (i = 0; i < tamanho; i++){
       scanf("%d",&vetor[i]);
   }
   return retorno;
}

int main()
{
   int* vetor[5];
   printf("%d",populaVetor(5,vetor[5]));
   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia, estou tendo dificuldade em desenvolver uma função para preencher todo meu vetor, o código que se segue ao executar dá erro de execução após eu inserir o último elemento do vetor, alguém saberia o por quê?

 

int populaVetor (int tamanho, int vetor[]){
   int i;
   int retorno = 0;
   for (i = 0; i < tamanho; i++){
       scanf("%d",&vetor[i]);
   }
   return retorno;
}

int main()
{
   int* vetor[5];
   printf("%d",populaVetor(5,vetor[5]));
   return 0;
}

 

você declarou vetor como um ponteiro de um vetor, que no final das contas é o mesmo comportamento de uma vetor bidimensional. Se você se aprofundar em C, vai descobrir em alocação dinamica que

int * = int [] e int ** = int [][]

 

Mas enfim isso é papo furado por enquanto, então, você precisa declarar:

int vetor[5];

 

e na chamada da função populaVetor:

populaVetor(5,vetor);

Compartilhar este post


Link para o post
Compartilhar em outros sites

você declarou vetor como um ponteiro de um vetor, que no final das contas é o mesmo comportamento de uma vetor bidimensional. Se você se aprofundar em C, vai descobrir em alocação dinamica que

int * = int [] e int ** = int [][]

 

Mas enfim isso é papo furado por enquanto, então, você precisa declarar:

int vetor[5];

 

e na chamada da função populaVetor:

populaVetor(5,vetor);

 

David, ponteiros e arrays não são a mesma coisa.

 

Só pra esclarecer, o que foi declarado ali foi um vetor de 5 ponteiros para int.

 

Se tiverem dúvidas, podem perguntar :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

David, ponteiros e arrays não são a mesma coisa.

 

Só pra esclarecer, o que foi declarado ali foi um vetor de 5 ponteiros para int.

 

Se tiverem dúvidas, podem perguntar :)

 

 

Na verdade acho que eu me equivoquei na hora de explicar, um array retorna um endereço, então o compilador trata uma declaração de int[] como int * e int ** = int [][]

Compartilhar este post


Link para o post
Compartilhar em outros sites

David,

 

Arrays não "retornam" ponteiros.

 

O que acontece é que ao avaliar o nome de um array, o que se produz como valor é um ponteiro para seu primeiro elemento. O objeto em si é, ainda, simplesmente um array.

 

A consequência disto é que em C, é impossível passar arrays como argumentos ou declarar arrays como parâmetros.

 

Exemplo:

 

int foo(int a[10])
{
   // ...
}

 

A declaração de foo dita que seu parâmetro a receberá, em invocações, o valor de um objeto de tipo (int[10]), que, como dito acima, terá tipo (int *).

 

Essa declaração é funcionalmente equivalente a essas:

 

int foo(int *a);
int foo(int a[]);

 

O mesmo vale para arrays de arrays:

 

int bar(int b[5][20])
{
   // ...
}

 

Aqui, o parâmetro b sempre receberá valores de tipo (int (*)[20]) -- ou seja, "ponteiro para array de 20 (int)s".

 

Fica fácil entender isto quando se sabe que em C só há passagem por valores, e não por referência. Chamadas como foo(&baz) passam o valor da aplicação do operador & ao operando baz, que tem tipo "ponteiro para (T)" (sendo (T) o tipo de baz). Isto é diferente, em diversos aspectos, do modelo de passagem por referência.

 

Obs: costuma-se dizer que podemos "envolver" arrays em structs para passá-las como argumentos ou retorná-las de funções. Isto faz com que se passe ou retorne structs, e nunca arrays. Parece óbvio, mas isto tem implicações diversas sobre a representação e uso dos argumentos/parâmetros/valores de retorno.

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.