Werte innterhalb eines VOID-Pointers ändern
-
Hi!
Ich habe eine kurze Frage bezüglich Pointer.
Genauer gesagt, geht es um VOID-Pointer.
Angenommen ich habe einen Void-Pointer, in dem mehrere Datentypen gespeichert werden sollen. Der VOID-Pointer soll 32 Byte groß sein.
In den ersten beiden 8 Byte Blöcken sind DOUBLE Werte gespeichert. Die letzten 16 Byte bieten Platz für eine Zeichenfolge (CHAR).Den Pointer erstelle ich so
void* Pointer(32);
Nun meine Frage:
Wie kann ich beispielsweise die Werte im zweiten DOUBLE-Wert verändern?Geht das überhaupt, oder habe ich da mal wieder was falsch verstanden?
-
Warum willst du sowas machen?
-
Du hast Pointer völlig, und damit meine ich völlig falsch verstanden. Das was du machen willst, sieht mir nach nem struct aus?
struct my_struct { double d1; double d2; char s[16]; };
Muss garantiert sein, dass alles direkt hintereinander im Speicher liegt? Wie auch immer, du solltest erstmal die Grundlagen lernen.
-
Kurby schrieb:
Angenommen ich habe einen Void-Pointer, in dem mehrere Datentypen gespeichert werden sollen.
Quatsch. Ein void-Pointer speichert genau eine Sache: Eine Speicheradresse.
Kurby schrieb:
Der VOID-Pointer soll 32 Byte groß sein.
void-Pointer sind immer gleich groß, nur so groß wie sie sein müssen, um eine Speicheradresse speichern zu können.
Kurby schrieb:
Den Pointer erstelle ich so
void* Pointer(32);
Ich denke nicht, dass es einen Compiler gibt, der das frisst.
Kurby schrieb:
Nun meine Frage:
Wie kann ich beispielsweise die Werte im zweiten DOUBLE-Wert verändern?Die Frage ergibt keinen Sinn, weil bis hierhin schon zu viele Missverständnisse aufgetaucht sind.
Kurby schrieb:
oder habe ich da mal wieder was falsch verstanden?
Sieht ganz so aus. Zumindest verwendest du die Begriffe falsch.
-
Ah, ok
Dann vielleicht etwas umformuliert.
In einem Void-Pointer ist die Addresse gespeichert, wo ein Double-Wert gespeichert ist.
Kann ich nun im Speicher direkt hinter dieser Wert einen weiteren Double-Wert setzen?
-
Kurby schrieb:
Kann ich nun im Speicher direkt hinter dieser Wert einen weiteren Double-Wert setzen?
daddy_felix schrieb:
Warum willst du sowas machen?
-
Kurby schrieb:
Ah, ok
Dann vielleicht etwas umformuliert.
In einem Void-Pointer ist die Addresse gespeichert, wo ein Double-Wert gespeichert ist.
Kann ich nun im Speicher direkt hinter dieser Wert einen weiteren Double-Wert setzen?
Nein. Der Speicher dahinter gehört die ja nicht. Du könntest Speicher für 2 double Werte anfordern, den ersten Wert kopieren und den anderen setzen, aber das macht so alles überhaupt keinen Sinn was du da vor hast.
Edit:
So rein von der Syntax her geht das natürlich:double d; double* p = &d; *p = 4.3; // Erlaubt, setzt d *(p + 1) = 77.7; // Undefiniertes Verhalten.
Wozu auch immer man da einen void Zeiger brauchen sollte..
-
Kurby schrieb:
In einem Void-Pointer ist die Addresse gespeichert, wo ein Double-Wert gespeichert ist.
Kann ich nun im Speicher direkt hinter dieser Wert einen weiteren Double-Wert setzen?
Was meinst du damit genau? Wo kommt die Adresse eigentlich her? Warum ist es ein void-Zeiger und kein double-Zeiger?
Je mehr du an Kontext verrätst, desto besser kann man dir helfen.
-
Ich schreibe eine Schnittstelle für ein Programm. Dieses Programm erwartet eine Adresse (VoidPointer), ab wo verschiedene Daten zur Verfügung stehen (z.B. DOUBLE Werte, Zeichenfolgen).
Du könntest Speicher für 2 double Werte anfordern, den ersten Wert kopieren und den anderen setzen
Das hört sich evtl. so an, als ob das klappen könnte. Wie genau mache ich das denn?
-
Kurby schrieb:
Ich schreibe eine Schnittstelle für ein Programm. Dieses Programm erwartet eine Adresse (VoidPointer), ab wo verschiedene Daten zur Verfügung stehen (z.B. DOUBLE Werte, Zeichenfolgen).
Das klingt ganz danach, als solltest du eine Struktur anlegen und die Adresse übergeben.
/* mal schamlos von cooky geklaut */ struct my_struct { double d1; double d2; char s[16]; } void function(void* data); int main() { struct my_struct var = { 3.141, 42.0, "Hallo" }; function(&var); }
-
Vielen Dank!
Das hat super funktioniert!
-
Zeile 7 fehlt ein ; ^^
Aber nicht ganz uninteressant:struct my_struct { double d1; double d2; char s[16]; }; static_assert(sizeof(my_struct) == 32, "...");
Dann sind wir auch gleich auf der sicheren Seite, auch wenn es bei so einem struct natürlich unwahrscheinlich ist. Wenn das assert fehlschlagen sollte, wird's frickelig.
-
cooky451 schrieb:
Zeile 7 fehlt ein ; ^^
In Zeile 7 sind jetzt zwei ^ zuviel
static_assert(sizeof(my_struct) == 32, "...");
Huch, gar nicht gesehen, dass wir im C++-Forum sind. Kann bei void*-Gehampel schonmal passieren.