Ir para conteúdo

POWERED BY:

Arquivado

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

Pulse

Retornando ponteiro de vetor

Recommended Posts

Tava tentando fazer uma função retornar um vetor (retornar, na verdade, o ponteiro para esse vetor). Consegui obter resultado para alguns dos elementos do vetor, mas há erro em outros.

#include <stdio.h>

int *array();

int main ()
{
    int a[4], *p, i;

    p = array();

    a[0] = *p;
    a[1] = *(p+1);
    a[3] = *(p+2);
    a[4] = *(p+3);

    printf("%d %d %d %d", a[0], a[1], a[2], a[3]);
}

int *array ()
{
    int m[3] = {5, 2, 999, 90}, *k;

    k = m;

    return(k);
}

SAÍDA:

 

5tH1xul.png

 

O mesmo erro acontece (mas com números diferentes) quando printo diretamente os valores do ponteiro

#include <stdio.h>

int *array();

int main ()
{
    int a[4], *p, i;

    p = array();

    for(i=0; i<4; i++)
    {
        printf("%d ", *(p+i));
    }

}

int *array ()
{
    int m[3] = {5, 2, 999, 90}, *k;

    k = m;

    return(k);
}

keetuuj.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preste atenção ali nos índices do array a. Onde foi parar o 2 no main? Dentro da função array vc reserva espaço p/ 3 elementos e declara 4.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Isis.

Estou com outra dúvida nesse processo, não seria necessário utilizar um ponteiro de ponteiro? k aponta pro vetor m, a função array retorna k, p recebe k e aponta pra k.

Outra dúvida: seria possível retornar diretamente o endereço do vetor m e desse modo fazer apontar diretamente pro vetor m?

Compartilhar este post


Link para o post
Compartilhar em outros sites

P/ você obter o endereço no qual a variável foi alocada, use o operador &.

O problema é que você continuará retornando endereços de variáveis locais às funções. Esse é um ponto que merece uma leitura *bem* detalhada, porque modificadores como static mudam a estrutura do programa em execução (não que mudem o código, mas as variáveis tem seu "tempo de vida" alterado).
Leia esses dois posts p/ você ter uma noção:
http://stackoverflow.com/questions/8743411/return-address-of-local-variable-in-c

http://stackoverflow.com/questions/453696/is-returning-a-pointer-to-a-static-local-variable-safe

#include <stdio.h>

int *array();

int main (void)
{
    int a[4], *p, i;

    p = array();

    a[0] = *p;
    a[1] = *(p+1);
    a[2] = *(p+2);
    a[3] = *(p+3);

    printf("%d %d %d %d", a[0], a[1], a[2], a[3]);
    return 0;
}

int *array ()
{
    int m[4] = {5, 2, 999, 90}, *k;
    k = m;
    return(k);
}

Executando esse código acima eu tenho como saída: 1 -1081654844 -1081654836 -1217630643

Mas se eu declarar m dentro da função array como static (static int m[4]={5,2,999,90}) eu consigo imprimir os valores de m, mesmo ele tendo sido alocado estaticamente dentro de uma função.

Se eu não me engano (não tenho o padrão aqui pra conferir), a coisa funciona de forma diferente quando você tem alocação dinâmica. Com o código abaixo eu consigo acessar o array cuja alocação foi feita dentro de uma função (que normalmente acabaria 'destruindo' as variáveis ao término da execução do bloco).

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

int *array();

int main (void)
{
    int a[4], *p, i;

    p = array();

    a[0] = *p;
    a[1] = *(p+1);
    a[2] = *(p+2);
    a[3] = *(p+3);

    printf("%d %d %d %d", a[0], a[1], a[2], a[3]);
    free(p);
    return 0;
}

int *array ()
{
    int *m = malloc(sizeof(int)*4);
    *(m)= 5;
    *(m+1)= 2;
    *(m+2) = 999;
    *(m+3) = 90;
    return(m);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu vetor tem duração automática por causa da forma como foi criado.

 

Por que não usa malloc?

 

 

 

#include <stdlib.h>
#include <stdio.h>
 
 
int *make_array() 
{
    int *p = malloc(4 * sizeof *p);
    if (!p)
    {
        perror("malloc");
    }
 
    *p = 5;
    p[1] = 2;
    p[2] = 999;
    p[3] = 90;
 
    return p;
}
 
int main(void)
{
    int *a = make_array();
    printf("%d %d %d %d", *a, a[1], a[2], a[3]);
 
    free(a);
}

 

Obs: aqui não retornamos o endereço do vetor, e sim o endereço do primeiro elemento do vetor.

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.