• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

jamirooo

[Resolvido] warnings na impressao de apontadores

10 mensagens neste tópico

Boas! comecei recentemente a "mexer" em apontadores e tenho aqui uma pequena dúvida num exercício. tenho o seguinte programa:

#include <stdio.h>
int main(){
int a = 1, b = 2, *pa = NULL, *pb = NULL;
pa = &a; pb = &b;
printf("%d %d\n", a, b);
printf("%d %d\n", &a, &b);
printf("%d %d\n", &pa, &pb);
printf("%d %d\n", pa, pb);
printf("%d %d\n", *pa, *pb);
return 0;
}

e quando vou compilar recebo uns quantos warnings "int format, ponter arg (arg 2)"

se alguém souber como "acabar" com os warnings...

Obrigado desde já...

já agora o comando que estoua utilizar para combpilar é gcc -Wall -g -o <nome do executavel> <nome.c>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isso acontece pq o "%d" tá á espera de um inteiro e passas-lhe um apontador pa inteiro, ou seja, um endereço de memoria. como o teu objectivo é ver esse endereço d memoria podes fazer um cast pa inteiro, ou seja, adicionas (int) antes da variavel (so nas linhas 6, 7 e 8 claro) ficando com coisas do tipo printf("%d %d\n", (int)&a, (int)&;);

espero ter exclarecido alguma coisa...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem depende como queres "acabar" com os warnings :D 

Se os quiseres ignorar basta tirares o -Wall quando compilas, mas julgo não ser isso que queres...

Eu quando compilo o teu cod em windows com -Wall não recebos os warnigs que tu estas a receber...

Até porque acho que tu podes fazer o que tens no codigo, porque um ponteiro é um endereço em memória, endereço que pode ser interpretado como inteiro.

Mas como ja disse, no windows sem warnings com o Visual C++ Compiler

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
e quando vou compilar recebo uns quantos warnings "int format, ponter arg (arg 2)"

Isto quer dizer que o compilador detectou uma inconsistência entre o formato e os dados.

o formato "%d" requer um int

tu estás a passar um int*

Para imprimires um int* tens que convertê-lo para void* e usar o format "%p".

printf("%p %p", (void*)&a, (void*)&b);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isso acontece pq o "%d" tá á espera de um inteiro e passas-lhe um apontador pa inteiro, ou seja, um endereço de memoria. como o teu objectivo é ver esse endereço d memoria podes fazer um cast pa inteiro, ou seja, adicionas (int) antes da variavel (so nas linhas 6, 7 e 8 claro) ficando com coisas do tipo printf("%d %d\n", (int)&a, (int)&b);

espero ter exclarecido alguma coisa...

Isto quer dizer que o compilador detectou uma inconsistência entre o formato e os dados.

o formato "%d" requer um int

tu estás a passar um int*

Para imprimires um int* tens que convertê-lo para void* e usar o format "%p".

printf("%p %p", (void*)&a, (void*)&b);

e agora qual destas será a maneira mais correcta? eu entendo melhor a solução do nata79... =/

Bem depende como queres "acabar" com os warnings :D

Se os quiseres ignorar basta tirares o -Wall quando compilas, mas julgo não ser isso que queres...

Eu quando compilo o teu cod em windows com -Wall não recebos os warnigs que tu estas a receber...

Até porque acho que tu podes fazer o que tens no codigo, porque um ponteiro é um endereço em memória, endereço que pode ser interpretado como inteiro.

Mas como ja disse, no windows sem warnings com o Visual C++ Compiler

eu tou a compilar no Windows mas com o Cygwin...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esta

printf("%d %d\n", (int)&a, (int)&:D;

vai-te imprimir em tipo inteiro o endereço de a e b em memoria

esta

printf("%p %p", (void*)&a, (void*)&B);

vai-te imprimir em hexa o dendereço de a b em memoria

corrijam-me se estou errado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esta

printf("%d %d\n", (int)&a, (int)&:D;

vai-te imprimir em tipo inteiro o endereço de a e b em memoria

esta

printf("%p %p", (void*)&a, (void*)&B);

vai-te imprimir em hexa o dendereço de a b em memoria

corrijam-me se estou errado

Um `int` e um `int *` não são necessariamente compativeis.

Como é que se convertem endereços dum x86 em modo real para inteiro?

0x0000:0x0024 == 36??

0x0002:0x0004 == 36??

Estes dois 'pointers' apontam para o mesmo byte de memória?

Têm as mesmas permissões de acesso a essa memória?

São os dois válidos?

O gajo que fez o compilador para a tua máquina sabe muito melhor que tu o que é um ponteiro válido para a máquina e sabe muito melhor que tu como representá-lo (usando "%p").

Aliás, não há razão para quereres saber o valor dum ponteiro. Não podes fazer absolutamente nada com esse valor. Excepto para trabalho de detective ... e para trabalho de detective é melhor usar um formato válido :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como o pmg já disse, o especificador correcto para imprimir ponteiros para memória é %p.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora