2009-06-28 12 views
69

Voglio fare qualcosa che sembra abbastanza semplice. Ottengo risultati ma il problema è che non ho modo di sapere se i risultati sono corretti.Stampa l'indirizzo un puntatore Contiene in C

Sto lavorando in C e ho due puntatori; Voglio stampare il contenuto del puntatore. Non voglio dereferenziare il puntatore per ottenere il valore puntato, voglio solo l'indirizzo che il puntatore ha memorizzato.

Ho scritto il seguente codice e quello che ho bisogno di sapere è se è giusto e se no, come posso correggerlo.

/* item one is a parameter and it comes in as: const void* item1 */ 
const Emp* emp1 = (const Emp*) item1; 

printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1); 

Mentre sto postando questo (e il motivo è importante che sia corretto) è che alla fine ho bisogno di fare questo per un puntatore a un puntatore. Ovvero:

const Emp** emp1 = (const Emp**) item1; 
+0

Quello che hai scritto è corretto, quale problema stai vivendo esattamente? –

+0

Come ho descritto, stavo ottenendo risultati, ma non avevo modo di sapere se i risultati erano corretti o se mi stava dando spazzatura. Don e altri sotto (come te stesso) hanno confermato che questi risultati sono validi. –

risposta

24

Quello che hai è corretto. Naturalmente, vedrai che emp1 e item1 hanno lo stesso valore del puntatore.

+1

Non saranno gli stessi se il tipo di item1 fa parte di un'ereditarietà multipla e/o è un antenato di Emp, a seconda di come il compilatore espone ciascuna delle classi che compongono il tipo di item1. –

+2

@Jim: il tag "C" suggerisce altrimenti – Hasturkun

+1

@Jim: Hasturkun ha ragione. Sto lavorando in C. Avrei dovuto postarlo. –

34

Per stampare l'indirizzo in puntatore a puntatore:

printf("%p",emp1) 

per dereference una volta e stampare il secondo indirizzo:

printf("%p",*emp1) 

si può sempre verificare con debugger, se siete su uso linux ddd e visualizza memoria, o semplicemente gdb, vedrai l'indirizzo di memoria in modo da poter confrontare con i valori dei tuoi puntatori.

+0

è lo stesso del codice pubblicato da Frank. –

+0

bene, ho pensato che avesse chiesto se fosse corretto ... – stefanB

8

Dal momento che già sembra di aver risolto il display base indirizzo del puntatore, ecco come si potrebbe verificare l'indirizzo di un doppio puntatore:

char **a; 
char *b; 
char c = 'H'; 

b = &c; 
a = &b; 

si sarebbe in grado di accedere all'indirizzo del doppio puntatore a da facendo:

printf("a points at this memory location: %p", a); 
printf("which points at this other memory location: %p", *a); 
+0

'printf (" che contiene questo valore:% c \ n "** a);" volevo semplicemente aggiungere quello ^. ^. – RastaJedi

13

Credo che questo sarebbe più corretto.

printf("%p", (void *)emp1); 
printf("%p", (void *)*emp1); 

printf() è una funzione variadic e devono essere passati argomenti dei tipi destra. Lo standard dice %p prende void *.

+0

Immagino che siano promossi? Non sono sicuro, qualcuno può chiarire? – RastaJedi

+2

Dopo alcune ricerche, no, non vengono promossi automaticamente. È necessario un cast per 'void *'. – RastaJedi

0

Sono stato in questa posizione, soprattutto con il nuovo hardware. Ti suggerisco di scrivere una piccola routine esadecimale tua. Sarai in grado di vedere i dati e gli indirizzi in cui sono, mostrati tutti insieme. È una buona pratica e un costruttore di fiducia.

+3

a scapito di sembrare ignoranti - potresti approfondire come si scrive una routine del genere? –

+0

Anche questa risposta potrebbe essere più adatta come commento? – RastaJedi

3
char c = 'A'; 
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c); 

risultato:

PTR: 0xbfb4027f, valore: A, e anche a: 3216245375