[Resolvido] Problema com Ponteiros

Boa noite Senhores!

No código a seguir, preciso imprimir os valores que estão no vetor, dentro da função “fazVetor” e também dentro da função “main”. Contudo, preciso fazê-lo utilizando as variáveis de duplo ponteiro, como está no código. Porém, este código não funciona e eu não sei o porquê.

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

void fazVetor(int **ocorr){
    int vet[] = { 1, 2, 3, 4, 5};
    int *pOcor;

    pOcor = vet;
    ocorr = &pOcor;

    printf("--==[Inside Function]==--");
    for(int i = 0; i < 5; i++){
        printf(" %i", *(*ocorr + i));
    }
}

int main()
{
    int **pp;

    fazVetor(pp);

    printf("--==[Outside Function]==--");
    for(int i = 0; i < 5; i++){
        printf(" %i", *(*pp + i));
    }

    return 0;
}

Se alguém puder a judar, será de grande valia.

De antemão, muito obrigado!

Edwar Saliba Jr.

Você está alocando os dados na pilha em variáveis locais dentro de fazVetor() e essas variáveis vão ser destruidas ao sair da função.

Você precisa usar malloc() se quer acessar os valores no método que chamou fazVetor().

Podem haver outros problemas, mas isso é o mais gritante dando uma olhada rápida. Da próxima vez também ajuda dizer qual erro está dando.

Boa tarde Kronal e demais membros do fórum!

Na verdade não dá erro algum, somente não imprime ou imprime endereços de memória. Esta é a versão reduzida, assim digamos, do código que eu estou trabalhando.

Seguindo sua dica, fiz o seguinte:

#include <stdio.h>
#include <stdlib.h>
#define TAM 3

void fazVetor(int **vet){
    int *array = malloc(sizeof(int) * TAM);

    array[0] = 4;
    array[1] = 7;
    array[2] = 8;

    /* Nesta função somente a linha a seguir pode ser alterada. */
    *vet = &array;
}

int main()
{
    int **qq;

    /* Aqui na função main, somente a linha a seguir NÃO PODE ser alterada. */
    fazVetor(&qq);

    printf("\n--==[Outside Function]==--\n\n");
    for(int i = 0; i < TAM; i++){
        printf(" %d", (*qq + i));
    }

    printf("\n\n");

    return 0;
}

Se puder me ajudar será de grande valia!

No código acima estipulei, por meio de comentários, duas regrinhas. Se alguém quiser ajudar e para que não se fuja do problema real, estas regrinhas devem ser respeitadas.

O meu único objetivo é imprimir os valores do vetor criado na função “fazVetor”.

De antemão, muito obrigado a todos!

Edwar Saliba Jr.

Na verdade aqui na minha máquina até mostra alguma coisa, só mostra coisas “erradas”:

 --==[Outside Function]==--
 0 4 8

O problema é que seu código tá uma goroba de mistura de tipos! rs

Veja os warnings!

Vou te dar uma dica sobre a linha:

O tipo da variável vet é int**, o tipo da variável array é int*.

Assim, na linha da atribuição que citei acima, o tipo de *vet é int*, mas o tipo de &array é int**, que a linguagem C deixa atribuir, mas provavelmente não é o que você quer.

Você quer atribuir a *vet o valor de array, que ambos como já falei, são int*. Ou seja, *vet = array;

Com isso a função fazVetor() faz o que você quer. Mas no main() há ainda problemas do mesmo tipo, mistura de tipos errados, como passar um int*** quando você quer passar um int**, por exemplo. Use o mesmo tipo análise pra corrigir isso.

Pois é meu caro, mas funciona! E devo todo o mérito ao meu companheiro do CEFET-MG, Evandro Caldeira, que solucionou o problema.

Segue o código:

#include <stdio.h>
#include <stdlib.h>
#define TAM 3

int fazVetor(int **vet){
    int *array = (int *) malloc(sizeof(int) * TAM);

    array[0] = 4;
    array[1] = 7;
    array[2] = 8;

    *vet = array;
}

int main()
{
    int *qq;

    fazVetor(&qq);

    printf("\n--==[Outside Function]==--\n\n");
    for(int i = 0; i < TAM; i++){
        printf(" %d", (qq[i]));
    }

    printf("\n\n");
    return 0;
}

A todos vocês que dedicaram seu precioso tempo na tentativa de solucionar este problema, deixo aqui meus sinceros agradecimentos.

Edwar Saliba Jr.

Claro, depois de você corrigir o main() funciona :smiley: