Domanda

Come posso ottenere l'indirizzo di memoria del valore di un puntatore punta a? nel mio caso si tratta di un puntatore nullo. solo assegnandolo a un uint mi dà questo errore:

Error   1   error C2440: 'return' : cannot convert from 'void *' to 'UInt32'

grazie!

È stato utile?

Soluzione

std::size_t address = reinterpret_cast<std::size_t>(voidptr);
// sizeof(size_t) must be greater or equal to sizeof(void*)
// for the above line to work correctly.

@ Paolo Hsieh
Penso che sia sufficiente per convertire void* a size_t in questa specifica domanda per tre motivi:

  • L'interrogante non ha specificato se lui vuole una soluzione portatile o no. lui ha detto, che ha lavorato con lui. Non so esattamente cosa ma questo significa è chiaro per me lui è lavorando su IA-32 su Windows o altro sistema in modalità protetta. Quello significa convertire un puntatore ad un integer è un'operazione definita su tale sistema anche se non è definito dalla norma C ++.

  • In secondo luogo, ho proposto prima convertire il puntatore al int che è chiaramente priva di senso come litb e JALF mi ha mostrato. Ho corretto l'errore che ho fatto, e lo ha sostituito con int size_t.

  • Infine, ho provato il mio è difficile trovare qualcosa di rilevante per ciò che si propone come una soluzione nelle norme. Purtroppo, non ho trovato nulla di rilevante. Ho questo riferimento: ANSI ISO IEC 14882 2003 . Penso sellibitze ha sottolineato che si far parte dei prossimi standard. Io davvero non so C, e, ovviamente, C99 introdotto questa soluzione perfetta. Vorrei che qualcuno mi mostrare una soluzione portatile in C ++.

Per favore, non esitate a correggere i miei errori, io sono ancora uno studente presso UNI:)

Grazie,

Altri suggerimenti

Un puntatore, in C e C ++ è la forma di realizzazione di un indirizzo di memoria in alcune forme astratte. È possibile ottenere un'implementazione specifica interpretazione stringa di un puntatore come:

printf ("%p", voidPointer);

Un altro modo è quello di gettarlo ai intptr_t:

(intptr_t) voidPointer;

Il puntatore NULL in C ++ è definita come uguale a "0", quindi presumibilmente si otterrebbe l'equiavlent di (intptr_t) 0 nell'operazione sopra. Tuttavia è ancora a voi e qualunque implementazione conoscenze specifiche si deve interpretare che come un indirizzo di memoria.

Il punto è che nelle piattaforme che utilizzano modelli di memoria bizzarre, come 16 bit compilatori x86 DOS, che hanno segmenti con offset come il loro modello di memoria, i puntatori possono essere interpretati in molti modi. In un discorso cruda rappresentazione NULL potrebbe essere DS: 0 o SS: 0 piuttosto che solo una pianura 0.

È necessario un cast - sia un reinterpret_cast (preferibile):

UInt32 address = reinterpret_cast<UInt32>( voidPointer );

o un cast C-style (in realtà non consigliato):

UInt32 address = (UInt32)voidPointer;

È possibile ottenere una rappresentazione di stringa l'indirizzo con sprintf () o visualizzarla con printf () utilizzando il formato p specificatore%, per esempio:

printf( "%p", voidptr ) ;

Se si desidera solo l'indirizzo di eseguire l'aritmetica dei puntatori su, gettò a un adeguato puntatore tipo di dati concreti, altrimenti gettato in un numero intero come già suggerito.

In C ++ ero in grado di stampare l'indirizzo punta con:

cout << "Address: " << ((unsigned)my_ptr);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top