void* ist buchstäblich schweben, wie Sie gewirkt?
So, ich bin mit dieser C-Bibliothek, die in meinem C++ - app, und eine der Funktionen liefert einen void*. Nun ich bin nicht das Schärfste mit reinem C, aber habe gehört, dass ein void* umgewandelt werden kann, um so ziemlich jede andere *-Typ. Ich weiß auch, dass ich erwarte, dass der Schwimmer am Ende irgendwo von dieser Funktion.
Also warf ich die void* float* und dereferenzieren der float*, Absturz. verdammt!.
Ich Debuggen Sie den code, und in gdb, lassen Sie es bewerten (float)voidPtr
und niedrige und siehe da der Wert ist das, was ich erwarte und brauche!
Aber warten Sie, es ist unmöglich, die gleiche, die während der Kompilierung. Wenn ich Schreibe float number = (float)voidPtr;
es wird nicht kompiliert, was natürlich verständlich ist.
So, jetzt die Frage, wie bekomme ich meine float aus diesem fricking void*?
EDIT: Dank H2CO3 dieses Problem gelöst wurde, aber ich sehe viele Antworten und Kommentare erscheinen und dissappering nicht glauben, dass ich tun konnte, (float)voidPtr in gdb. hier ist der screenshot.
- Natürlich, eine bessere Lösung ist, landen nicht in einer situation wie dieser zu beginnen.
- so OP geben sollte, auf eine ganze Bibliothek, denn es nutzt void-Zeiger?
- Nein, ich spreche von einem nicht-Zeiger wird interpretiert als ein void-Zeiger.
void *
ist völlig in Ordnung, in einigen Fällen, aber in OP ' s Fall, dass jemand irgendwo nach oben geschraubt. Vielleicht OP ist mit der Bibliothek falsch. - Vielleicht kann die Funktion gibt einen Zeiger oder einen aktuellen Wert, je nachdem, wie es aufgerufen wird. Ohne zu sehen, die Bibliothek, können wir nicht wirklich beurteilen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen mit Zeigern:
sizeof(float) == sizeof(void *)
das darf doch nicht wahr sein, und in diesem Fall das ruft nicht definiertes Verhalten.void *
zufloat
, aber Sie werfen kannvoid **
zufloat *
. Nun, wenn Sie das tun, und dereferenzieren der Adresse destheValueAsVoidPtr
variable, dann Holen Sie sich die Inhalt, dass die variable, nur in einer anderen Art - dies wird als Typ Zweideutigkeiten. Siehe die Zeile markiert mit "bösen floating-point-bit-level-hacking".Wenn ich das richtig verstanden habe, Ihre Bibliothek wieder ein float Wert in eine variable, deren Typ deklariert ist
void *
. Der sicherste Weg, um bekommen es wieder heraus, ist mit einerunion
:Anders als der Ansatz in der akzeptierten Antwort, das löst keine undefinierten Verhalten.
memcpy
.