C-Programmierung: Einen void-Zeiger auf ein int umwandeln?

Lesezeit: 3 Minuten

Benutzer-Avatar
Tim

Angenommen, ich habe eine Leere* namens ptr. Wie genau soll ich mit ptr vorgehen, um ein int zu speichern? Reicht es zu schreiben

ptr = (void *)5;

Wenn ich die Nummer 5 speichern möchte? Oder muss ich etwas mallocieren, um es zu speichern?

  • Ja, was Sie dort haben, wird gut funktionieren. Ob es eine gute Idee ist oder nicht, hängt davon ab, was genau Sie versuchen zu tun, aber es gibt kein Problem mit diesem Code, so wie er ist.

    – Karl Norum

    19. Oktober 2011 um 21:30 Uhr

  • Das cast ist ausreichend………………

    – James

    19. Oktober 2011 um 21:30 Uhr


  • Warum, um Himmels willen, willst du das tun?

    – Griwes

    19. Oktober 2011 um 21:30 Uhr

  • Was möchten Sie tun? Wir müssen das Gesamtbild sehen, um Ihnen zu helfen. Jetzt kann ich nur vermuten, dass der von Ihnen gepostete Code wahrscheinlich nicht das tut, was Sie erwarten würden.

    – Karel Petranek

    19. Oktober 2011 um 21:31 Uhr

  • Wollen Sie einen Zeiger auf den Speicherplatz 5 oder auf die Zahl 5? Es gibt einen großen Unterschied zwischen den beiden.

    – dbeer

    19. Oktober 2011 um 21:36 Uhr

Benutzer-Avatar
Brian Roach

Du wirfst 5 eine Leere sein Zeiger und zuordnen ptr.

Jetzt ptr zeigt auf die Speicheradresse 0x5

Wenn das wirklich das ist, was Sie versuchen zu tun … nun, ja, das funktioniert. Sie … wollen das wahrscheinlich nicht tun.

Wenn Sie “store an int” sagen, meinen Sie vermutlich, dass Sie den ganzzahligen Wert 5 tatsächlich in dem Speicher speichern möchten, auf den der zeigt void*. Solange genügend Speicher zugewiesen wurde ( sizeof(int) ) könntest du das mit Casting machen …

void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;

printf("%d\n",*((int*)ptr));

  • Ich mache das ständig, wenn ich mit einem Framework arbeite, das “Benutzerdaten” als void*aber alles, was ich brauche, ist ein int.

    – Muhende Ente

    19. Oktober 2011 um 21:41 Uhr

  • Solange jemand nach Ihnen es später nicht versehentlich dereferenziert, stimme ich zu, dass das funktioniert. Es macht mich nur ein bisschen zusammenzucken aus diesem Grund.

    – Brian Roach

    19. Oktober 2011 um 21:50 Uhr

  • Und ich wusste, dass mich noch etwas anderes störte – es ist nicht tragbar. developer.gnome.org/glib/2.28/glib-Type-Conversion-Macros.html

    – Brian Roach

    19. Oktober 2011 um 21:51 Uhr

  • @MooingDuck Ah! Genau darauf war ich gestoßen. Es ist also ein richtiger Anwendungsfall. Vielen Dank.

    – Andy

    11. Oktober 2014 um 19:57 Uhr

  • Wenn das OP fragen musste, ob ein Malloc verwendet werden soll oder nicht, bedeutet dies, dass er ein Malloc verwenden muss. Man geht nicht einfach ins Speichern von Ints in Zeigerräumen.

    – Drachen Lord

    7. Juni 2016 um 23:28 Uhr

Benutzer-Avatar
Boann

Das funktioniert auf allen Plattformen/Umgebungen wo sizeof(void*) >= sizeof(int), das sind wahrscheinlich die meisten, aber ich denke nicht alle. Darauf sollte man sich nicht verlassen.

Wenn Sie können, sollten Sie stattdessen eine Union verwenden:

union {
    void *ptr;
    int i;
};

Dann können Sie sicher sein, dass Platz für beide Datentypen vorhanden ist und Sie keinen Cast benötigen. (Versuchen Sie einfach nicht, den Zeiger zu dereferenzieren, während er Nicht-Zeiger-Daten enthält.)

Wenn der Grund dafür darin besteht, dass Sie ein int zum Speichern einer Adresse verwendet haben, sollten Sie stattdessen stattdessen verwenden size_t intptr_t so dass das groß genug ist, um jeden Zeigerwert auf jeder Plattform zu halten.

  • Nein, nicht verwenden size_t. Es ist nicht garantiert, dass alle möglichen Adressen von Zeigern gespeichert werden können. intptr_t und uintptr_t sind dafür seit C99 da. Bei C90 hast du Pech. Ich kann Ihnen sogar eine Plattform geben, wo size_t ist 16 Bit breit und Zeiger sind 32 Bit breit: x86 im Real-Modus unter Verwendung des Speichermodells HUGE, FAR und COMPACT. size_t kann als der Typ angesehen werden, der zum Adressieren von Arrays verwendet wird, nicht mehr.

    – Patrick Schlüter

    16. September 2014 um 7:49 Uhr

  • @tristopia Danke!

    – Boanne

    16. September 2014 um 7:52 Uhr

Ein Zeiger zeigt immer auf eine Speicheradresse. Wenn Sie also eine Variable mit einem Zeiger speichern möchten, speichern Sie in diesem Zeiger die Speicheradresse Ihrer Variablen.

1352470cookie-checkC-Programmierung: Einen void-Zeiger auf ein int umwandeln?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy