Frage

Wie bekomme ich die Speicheradresse des Wertes einen Zeiger auf? in meinem Fall ist es ein void-Zeiger. nur um es zu einem uint Zuordnung gibt mir diese Fehlermeldung:

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

Danke!

War es hilfreich?

Lösung

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.

@ Paul Hsieh
Ich denke, dass es ausreichend ist, void* zu size_t in dieser speziellen Frage aus drei Gründen zu konvertieren:

  • Der Fragesteller hat nicht angegeben, ob er will eine tragbare Lösung oder nicht. Er sagte, dass es mit ihm zusammengearbeitet. Ich weiß nicht genau, was Das bedeutet aber es ist mir klar, er ist Arbeiten auf IA-32 auf Windows oder andere System unter dem geschützten Modus. Das Einrichtung einen Zeiger auf ein Umwandeln integer ist eine definierte Operation auf dass das System, auch wenn es nicht durch Standard-C definiert ++.

  • Zweitens schlug ich zuerst den Zeiger auf int Umwandlung, die als eindeutig sinnlos litb und JALF hat mir gezeigt. Ich korrigierte den Fehler, den ich gemacht habe, und ersetzt int mit size_t.

  • Schließlich habe ich versucht, mein Fest etwas Relevantes zu finden, was Sie als Lösung in den Standards vorgeschlagen. Leider kann ich nichts relevant finden. Ich habe diese Referenz: ANSI ISO IEC 14882 2003 . Ich denke, sellibitze wies darauf hin, dass es wird Teil der kommenden Standards sein. Ich weiß wirklich nicht über C, und natürlich C99 eingeführt, um diese perfekte Lösung. Ich möchte jemanden zeigen, mir eine tragbare Lösung in C ++.

Bitte, zögern Sie nicht, meine Fehler zu korrigieren, ich bin immer noch ein Student an der Uni:)

Danke,

Andere Tipps

Ein Zeiger, in C und C ++ Die Ausführungsform einer Speicheradresse in einer abstrakten Form. Sie können eine Implementierung bestimmte Zeichenfolge Interpretation eines Zeigers erhalten, wie:

printf ("%p", voidPointer);

Eine andere Möglichkeit ist es intptr_t zu werfen:

(intptr_t) voidPointer;

Die NULL-Zeiger in C ++ als gleich "0" definiert, so vermutlich würden Sie die equiavlent von (intptr_t) 0 in der obigen Operation erhalten. Allerdings ist es immer noch bis zu Ihnen und was auch immer Implementierung spezifischer Kenntnisse muss man interpretieren, dass als Speicheradresse.

Der Punkt ist, dass in Plattformen, die bizarren Speichermodelle wie 16-Bit-x86-DOS-Compiler verwenden, die Segmente mit Offsets als Speichermodell haben, können Zeiger in vielerlei Hinsicht interpretiert werden. In einer rohen Adresse konnte Darstellung NULL DS sein: 0 oder SS: 0 und nicht nur eine einfache 0

Sie benötigen einen Guss - entweder eine reinterpret_cast (bevorzugt):

UInt32 address = reinterpret_cast<UInt32>( voidPointer );

oder ein C-Casts (wirklich nicht empfohlen):

UInt32 address = (UInt32)voidPointer;

Sie können eine String-Darstellung der Adresse mit sprintf get () oder mit printf () anzuzeigen, das% p Formatbezeichner verwenden, z:

printf( "%p", voidptr ) ;

Wenn Sie nur die Adresse möchten auf Pointer-Arithmetik durchzuführen, muss er in einem geeigneten konkreten Datentyp Zeiger, Guss sonst auf eine ganze Zahl, wie bereits vorgeschlagen.

In C ++ konnte ich die spitze Adresse drucken mit:

cout << "Address: " << ((unsigned)my_ptr);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top