2009-06-03 11 views
5

Devo rappresentare i puntatori come stringhe all'utente. A volte i valori possono essere salvati su un file e trasferiti su un computer con architettura diversa (32 vs 64 bit è il problema principale attualmente) e caricati da file di testo per essere confrontati - sto solo andando a confrontare i valori caricati l'uno con l'altro, ma preferirei comunque confrontare i numeri rispetto alle stringhe.Qual è il modo migliore per rappresentare il puntatore come stringa in C++?

Attualmente sto usando:

SomeClass* p; 
... 
printf("%ld", (uintptr_t)p); 

ma mi chiedo se questo è portatile (Windows e Linux sono solo importante in questa fase però), e se questo sarebbe rompere una volta i sistemi a 128 bit si presentano?

Edit: a meno che non decido di usare uint64_t, e decidere che a 64 bit è il tetto, questo non può essere fatto perché alcuni puntatore a 64 bit potrebbe essere al di fuori gamma a 32 bit integer. Quindi, ho deciso che sarebbe stato più sicuro confrontare le stringhe anche se è più lento.

risposta

20

Per i puntatori, utilizzare sempre %p --- è un identificatore di formato appositamente progettato per la stampa di puntatori nel formato corretto. :-)

+1

Ma non è portatile. Almeno, non ha dato un output coerente tra le piattaforme. In Visual Studio, i valori esadecimali sono espressi in maiuscole.In gcc, in minuscolo. – user48956

+2

* scuote la testa * Questa differenza vale anche la pena di preoccuparsi? È possibile che _never_ gli indirizzi vengano visualizzati allo stesso modo su tutte le piattaforme, ad esempio, nei programmi DOS in modalità reale a 16 bit, gli indirizzi vengono solitamente stampati in formato xxxx: yyyy. (Non è possibile rimuovere i due punti "solo per essere coerenti tra le piattaforme" --- sarebbe molto fuorviante, perché lo spazio degli indirizzi nei programmi DOS in modalità reale non è piatto.) –

+0

ad esempio, 0x11110000 e 0x11120000, nel modello di indirizzamento piatto , è 0x10000 byte a parte. Tuttavia, nei programmi DOS in modalità reale a 16 bit, 1111: 0000 e 1112: 0000 sono separati da 16 byte. –

7

printf ha un p formattatore% che credo sia standardizzato:

printf("%p", p); 

ma come si utilizza C++, ostreams già sovraccarico uscita puntatore:

#include <iostream> 
using namespace std;; 

class A {}; 

int main() { 
    A a; 
    cout << &a << endl; 
} 

produce:

0x22ff6f 
+0

Molto, molto standardizzato. :-P –

+1

Stai attento però. Come specializzano anche l'operatore di output per char * e stampano una C-String. –

9

Farei questo:

std::cout << p; 

Se hai il tuo cuore su cstdio:

printf("%p", p); 
+1

Grazie Fred. In realtà, sto usando wxWidgets che ha la funzione wxString :: Format che usa internamente snprintf quindi è per questo che avevo bisogno di un esempio di printf. –

3

Siete alla ricerca per la stringa %p formattazione?

printf("%p", p); 

Questo ti do l'indirizzo esadecimale con codifica il puntatore punta a (e, credo, formati NULL s per voi pure).

0

avrei fatto:

cout << p << endl; 

Strings (della stessa codifica) sono portatili. Se si desidera confrontarli come puntatori, è necessario prima analizzare la stringa in un unsigned long.

Per quanto riguarda i sistemi a 128 bit, sono lontani. Con 64 bit, è possibile indirizzare direttamente 16,8 milioni di terabyte di RAM.

0

Può anche essere fatto come

printf ("% # x", p);

Ciò garantirebbe un formato simile (0x ...) su più piattaforme.

Problemi correlati