Ir ao conteúdo
  • Cadastre-se

Curiosidade com retorno de array


Posts recomendados

Caras, nem tenho exemplos práticos pra falar disso, foi só uma curiosidade que me veio à mente. Estudo java e c++, mas em java sempre retornei vetores em funções. Entretanto, li num livro aqui que c não retorna array. Achei estranho, tentei e vi que é verdade. Pesquisei na net e vi uma solução no GUJ. O cara usava uma função que retorna um ponteiro para um array.

 

O problema disso era que o array era local, ou seja, quando a função encerrar a execução o ponteiro apontará pra um endereçamento problemático. Era algo mais ou menos assim:
 

int *retornaVetor(int x){

  int vetor[x];
  
  return *vetor;  

}

Enfim, se eu quiser retornar um vetor, como faço? Uso struct? Torno o vetor local da função static? Eu testei o código acima e sei que nem compila. Foi só um exemplo de idéias que li.

 

Valeu.

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

Opção 1:

 

Passa o vetor como parâmetro para a função, e a função apenas trabalha sobre ele:

void funcao (int n, int vetor[n]){
    int i;
    for (i = 0; i < n; i++){
        vetor[i] = i;
    }
}

 

 

Opção 2:

 

Aloca memória dinamicamente para o vetor dentro da função, e retorna um ponteiro para o vetor (precisa lembrar de liberar a memória quando não precisar mais do vetor):

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

int * funcao (int n){
   int i;
    int *vetor = (int *)malloc(n * sizeof(int));
    if (!vetor)
        return NULL;
    for (i=0; i < n; i++)
        vetor[i] = i;
    return vetor;
}

int main(){
    int i;
    int *vet = funcao(10);
    if (vet) {
        for (i = 0; i < 10; i++)
            printf("%d\n", *(vet + i));
        free(vet); //Libera a memória reservada para o vetor
    }
    return 0;
}

 

 

As outras opções são as que você mencionou, usar static, ou fazer uma struct contendo o vetor com tamanho predefinido e retornar a struct.

 

 

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

Para C++ além dessas tem outras opções...

 

Esse seria o equivalente em C++ para alocação dinâmica de memória:

#include <iostream>

using namespace std;

int * funcao (int n){
    int i;
    int *vetor = new int[n];
    for (i=0; i < n; i++)
        vetor[i] = i;
    return vetor;
}

int main(){
    int i;
    int *vet = funcao(10);
    for (i = 0; i < 10; i++)
        cout << vet[i] << endl;
    delete[] vet; //Libera a memória reservada para o vetor
    return 0;
}

 

Mas nesse caso um acredito que usar "vector" seria a melhor solução:

#include <iostream>
#include <vector>

using namespace std;

vector<int> funcao (int n){
    int i;
    vector<int> vetor;
    vetor.resize(n);
    for (i=0; i < n; i++)
        vetor[i] = i;
    return vetor;
}

int main(){
    int i;
    vector<int> vet = funcao(10);
    for (i = 0; i < 10; i++)
        cout << vet[i] << endl;
    return 0;
}

 

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...