2015-05-20 33 views
12

Il mio codice è:Come printf un indirizzo di memoria in C

#include <stdio.h> 
#include <string.h> 

void main() 
    { 
    char string[10]; 
    int A = -73; 
    unsigned int B = 31337; 

    strcpy(string, "sample"); 

    // printing with different formats 
    printf("[A] Dec: %d, Hex: %x, Unsigned: %u\n", A,A,A); 
    printf("[B] Dec: %d, Hex: %x, Unsigned: %u\n", B,B,B); 
    printf("[field width on B] 3: '%3u', 10: '%10u', '%08u'\n", B,B,B); 

    // Example of unary address operator (dereferencing) and a %x 
    // format string 
    printf("variable A is at address: %08x\n", &A); 

Sto usando il terminale in menta linux per la compilazione, e quando provo a compilare utilizzando gcc ottengo il seguente messaggio di errore:

basicStringFormatting.c: In function ‘main’: 
basicStringFormatting.c:18:2: warning: format ‘%x’ expects argument 
of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=] 
printf("variable A is at address: %08x\n", &A); 

Tutto quello che sto cercando di fare è stampare l'indirizzo in memoria della variabile A.

+10

'void main()' dovrebbe essere 'int main (void)'. Se il tuo libro, tutorial o istruttore ti ha detto di usare 'void main()', trova uno migliore. –

+0

@KeithThompson Che importanza ha? –

+0

@PrakharAgrawal: è importante perché lo standard ANSI C del 1989, che ha introdotto la parola chiave 'void', ha anche specificato che la funzione principale può essere definita come' int main (void) {/ * ... * /} '. Non dice nulla su 'void main()', e un'implementazione conforme può rifiutarla. Ci sono molti libri ed esercitazioni che suggeriscono l'uso di 'void main()'; questa è una forte indicazione che l'autore non conosce molto bene la lingua. (Questo è per le implementazioni ospitate.Per le implementazioni indipendenti, in cui il programma non viene eseguito con un sistema operativo, il punto di ingresso del programma è definito dall'implementazione –

risposta

32

Utilizzare l'identificatore di formato %p:

printf("variable A is at address: %p\n", (void*)&A); 

Lo standard richiede che l'argomento è di tipo void* per %p specificatore. Poiché, printf è una funzione variadica, non c'è alcuna conversione implicita a void * da T * che si verificherebbe implicitamente per qualsiasi funzione non-variadica in C. Quindi, è richiesta la trasmissione. Per citare lo standard:

7.21.6 formattato di input/output (progetto C11)

p L'argomento deve essere un puntatore a vuoto. Il valore del puntatore è convertito in una sequenza di caratteri di stampa, in un modo definito dall'implementazione .

Mentre si utilizza %x, che si aspetta unsigned int mentre &A è di tipo int *. Puoi leggere gli specificatori di formato per printf from the manual. La mancata corrispondenza degli specificatori di formato in printf porta a undefined behaviour.

+4

Importante cosa trasmettere a 'void *' –

+0

@Blue Moon - perché è importante eseguire il cast (void *)? – ryyker

+0

Ho provato, in una piccola app, stampare l'indirizzo della variabile con e senza cast ma ha ottenuto lo stesso risultato, ma chiaramente l'affermazione dello standard (_p L'argomento deve essere un puntatore a void_) lascia poco spazio all'interpretazione.Grazie – ryyker

Problemi correlati