1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

dúvida em C

Discussão em 'Programação' iniciada por incognito54, 19 de Abril de 2005. (Respostas: 7; Visualizações: 913)

  1. incognito54

    incognito54 Power Member

    tenho uma dúvidazinha em C...
    se eu tiver uma variável global que é um ponteiro e se depois tiver uma funcao q receba como argumento um ponteiro e alterar a posicao para onde aponta, o ponteiro global é alterado ou n?
    exemplo:
    Código:
    int *ponteiro;
    
    void funcao(int *pont) {
        if(pont == NULL) {
            int *pont = (int*) malloc(sizeof(int));
            pont = 0;
        }
    }
    
     
  2. Xpirit

    Xpirit Banido

    embora não seja exactamente como te vou dizer esta imagem dá para esclarecer a tua dúvida.

    Um ponteiro é uma variável com um endereço de memória (não é só isto mas pensa que sim).

    Quando chamas a tua função é criada uma variável temporária onde vais guardar um endereço de memória que te é passado. O teu ponteiro de facto aponta para um endereço válido onde está guardado um "type" neste caso int. Quando a tua função acaba (retorna) essa variável onde está o endereço (ponteiro) vai à vida bem como tudo o que lá metas mas apenas se trata de um ponteiro. O que está a ser apontado não vai à vida.
     
  3. Karmack

    Karmack Power Member

    Não.
    No exemplo que tu tens é criada na stack o argumento pont que contem um endereço (no caso de x86 é de 32 bits).
    Ao fazes pont = malloc.... estás a alterar a variavel que está na stack ou seja o pont e não essa variavel global.
    A solução está em usar ponteiro para ponteiro. No teu caso a memoria fica assim:

    pont ------> ponteiro ------> valor
    |------||||||||---------|||||||||-------|
    -stack----------heap------------heap


    Atenção que podes passar para a função o endereço de um ponteiro que esteja na stack.


    O código fica assim:

    Código:
    int *ponteiro;
    
    void funcao(int **pont) {
        if((*pont) == NULL) {
            (*pont) = (int*) malloc(sizeof(int));
            (**pont) = 0;
        }
    }
    
     
  4. Xpirit

    Xpirit Banido

    qual é o interesse de fazer (**pont) = 0 ?
     
  5. Karmack

    Karmack Power Member

    Para inicializar o valor de int a zero. No programa original está pont = 0. O que ele queria era inicializar o valor do int a 0 mas devia ter posto *pont = 0. Como passas ponteiro para ponteiro fazes **pont = 0.
     
  6. Xpirit

    Xpirit Banido

    Exacto. :D
     
  7. Karmack

    Karmack Power Member

    O ideal era chamar o calloc em vez do malloc. Muitas das vezes os programadores chamam o malloc para alocar estruturas que contem ponteiros (por exemplo listas ligadas) mas esquecem-se de as inicializar. Depois há bugs. Com o calloc ele inicializa a memoria alocada a zero.
     
  8. incognito54

    incognito54 Power Member

    muito obrigado, ja fiquei mais esclarecido! assimilei o conhecimento e a pouco e pouco vou-me tornando num melhor programador! :x2:
     

Partilhar esta Página