Ir ao conteúdo
  • Cadastre-se

Problema ao acessar endereço de memória


Posts recomendados

Estou mexendo com ponteiros, mas ao acessa o endereço de memoria sempre da um erro quando compilo e quando executo são números aleatorio e até negativos, o codigo :

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

int main(){
  int x=10,*p;
    p = &x;
    printf("%d",p); 

return(0);
}

Já tentei com o "%p" mas os número que aparecem começam com 0x7ff e nunca são fixos. O erro que da quando tento compilar com o "%d" é :

teste.c:10:12: warning: format ‘%d expects argument of type int’, but argument 2 has type int *’ [-Wformat=]
     printf("%d",p);
            ^

Não sei se muda algo, mas estou usando o gcc pelo linux mint 18.1

Link para o comentário
Compartilhar em outros sites

Se p é um ponteiro, então para imprimir o valor de p tem que referenciar: *p.

E.i.: printf( "Show valor de p: %d", *p );

 

Se p é um ponteiro, então para imprimir o número do local na memória de p basta tratar p como um int: p.

E.i.: printf( "Show Address memory: %d", (int)p  );

 

Link para o comentário
Compartilhar em outros sites

int x=10,*p; p = &x;

A x é um tipo de variável que guarda um numero inteiro, e está em uma determinada posição da memória. A p é relativamente igual, porém a diferença de um ponteiro e um int é que um ponteiro guarda um valor que indica onde está a variável apontada porém também guarda um numero.

A memória tem mais ou menos essa aparência:
123456789...
[][][][][][][][][]...

O numero de acima dos [] é a direção, e entre os [ e ] se guarda os valores. Vamos imaginar que o programa reserva memória para x e guarda lá o valor 10, a memória passaria a ter essa aparência:
12  3  456789...
[][][10][][][][][][]...
      x


Como podemos ver x está na posição 3, e guarda nessa posição um valor de 10 entre [ e ] da memória. Agora vamos reservar memória para p e faremos que aponte a x:
12  3  4567 8 9...
[][][10][][][][][3][]...
      x <-------p

Como podemos ver agora p guarda um valor também porém esse valor é 3, o que quer dizer que é na direção 3 onde está x.

Ponteiros sempre mostrarão a direção de x como hexadecimal, se quiser ver como um int deveria se fazer a conversão como ja lhe indicou Mauro, e enquanto a que sempre muda de lugar isso é normal, as variáveis podem ir parar em qualquer lugar já que é o sistema quem busca o melhor lugar onde as variáveis vão a parar, isso acontece porque existem muitos programas pedindo memória ao mesmo tempo ao sistema, então uma variável pode estar em um lugar e depois mudar de lugar se outro programa ocupou o seu antigo lugar.
 

    // valor de x
    printf ( "%d\n", x );
    printf ( "%d\n", *p );
    
    //direção de x
    printf ( "%d\n", (int)&x );
    printf ( "%d\n\n", &*p );
    
    
    //valor de p
    printf ( "%d\n\n", p ); // é o mesmo que a direção de x
    

    //direção de p
    printf ( "%d\n", &p );

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