Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Matheus Perusso

Problema ao acessar endereço de memória

Recommended Posts

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

Compartilhar este post


Link para o post
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  );

 

Editado por Mauro Britivaldo

Compartilhar este post


Link para o post
Compartilhar em outros sites
Matheus Perusso    1
  • Autor do tópico
  • Continua dando erro quando eu quero ver o endereço de memória e quando eu executo, varios numeros aleatorios e negativos, as vezes

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Locais na memória não são fixo.

    p -> é um local na memoria, e em printf o string format correto é "%p".

    E naturalmente é  exibido um número hexadecimal.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    vangodp    399

    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 );

    Editado por vangodp

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×