2015-01-03 9 views
5
#include<stdio.h> 
void main() 
{ 
    int i = 5; 
    printf("%p",i); 
} 

ho provato a compilare questo programma su Linux usando il compilatore GCC, che sulla compilazione del programma emette un avviso dicendouscita imprevisto quando si stampa il valore di un numero intero

%p expects a void* pointer 

e quando corsa dà una potenza di 46600x3.

Ma quando ho compilare on-line utilizzando il sito codingground.tutorialspoint.com ottengo un output uguale 0x5 cioè un'uscita esadecimale, chiunque può spiegare il motivo?

+0

Usa 'd'% invece. – Maroun

risposta

6

%p si aspetta l'indirizzo di qualcosa (o un puntatore). Si fornisce il valore della variabile i invece dell'indirizzo. Utilizzare

printf("%p",(void*)&i); 

invece di

printf("%p",i); 

e GCC verrà compilato il programma senza avvertimenti e stamperà l'indirizzo dove i viene memorizzato quando lo si esegue. La e commerciale (&) è l'indirizzo-di operatore e fornisce l'indirizzo della variabile. Il cast è anche neccessary come identificatore di formato %p aspetta un argomento di tipo void* che &i è di tipo int*.


Se si desidera che il valore della variabile da stampare, utilizzare

printf("%d",i); 

Utilizzando l'identificatore di formato sbagliato porterà a UB(Undefined Behavior)

+1

'p' richiede un' (void *) 'argomento. Devi usare 'printf ("% p ", (void *) &i);' – ouah

+0

@ouah, GCC non fornisce alcun avvertimento senza il cast. Inoltre, ottengo lo stesso risultato se avessi/non avessi aggiunto il cast. Il cast è obbligatorio? –

+0

gcc avverte con '-pedantic', e sì il cast è richiesto – ouah

4
printf("%p",i); 

L'utilizzo di un identificatore di formato errato porterà a un comportamento non definito. %p aspetta l'arguement di tipo void * nel tuo caso si sta passando il valore di i e non l'indirizzo al fine di stampare l'indirizzo si dovrebbe passare &i

Si dovrebbe usare

printf("%d",i); 

per stampare l'intero valore i

Il codice dovrebbe essere come

#include<stdio.h> 
void main() 
{ 
    int i = 5; 
    printf("%d",i); /* To print value of i */ 
    printf("%p",(void *)&i); /* Address of variable i */ 
} 
+1

'p' richiede un argomento' (void *) '. Devi usare 'printf ("% p", (void *) &i);' – ouah

+0

@ouah sì ho detto che nella mia risposta fusione 'void *' sembra ridondante non se ti senti così? – Gopi

+1

Il cast in 'printf ("% p", (void *) &i); 'non è ridondante, è richiesto come' & I' non è di tipo '' void *. – ouah

Problemi correlati