Casting eines void-Zeigers auf eine Struktur

Lesezeit: 4 Minuten

Ich fing an, mich mit C wohl zu fühlen, und dann stieß ich auf Typecasting. Wenn ich folgendes in einer *.h-Datei definiert habe

struct data {
    int value;
    char *label;
};

und dies in einer anderen *.h-Datei

# define TYPE      void*

Wie setze ich den void-Zeiger in die Struktur um, damit ich eine Variable “TYPE val” verwenden kann, die an Funktionen übergeben wird? Wenn ich beispielsweise den Wert verwenden möchte, auf den TYPE val zeigt, wie kann ich ihn umwandeln, damit ich diesen Wert an andere Funktionen übergeben kann?

  • #define TYPE void* ist eine schlechte Idee. Es sollte zumindest eine sein typedef stattdessen. Überlegen Sie, was in der folgenden Deklaration passieren würde: TYPE x, y; oder const TYPE x;.

    – jamesdlin

    18. Februar 2013 um 22:46 Uhr

  • Auch, wenn Sie damit zu tun haben void* Zeiger und C, müssen Sie kein explizites Casting durchführen. C erlaubt void* Hinweise zu sein implizit gießen: void* p = ...; struct data* val = p;.

    – jamesdlin

    18. Februar 2013 um 22:48 Uhr

  • @jamesdlin Ich stimme zu, dass es eine schlechte Idee ist, aber es ist nicht meine Idee, also muss ich mitmachen. Also zusammen damit, wann TYPE val als void-Zeiger an eine Funktion übergeben wird, kann ich einfach deklarieren struct data* temp = val; dann übergeben Sie temp an eine Funktion und ich sollte dann temp-> value verwenden können?

    – Benutzer1852050

    18. Februar 2013 um 23:38 Uhr


  • Ja, dann könnten Sie verwenden temp->value.

    – jamesdlin

    19. Februar 2013 um 0:15 Uhr

  • Danke, deine Antwort war einfach und hilfreich. Wenn es im Antwortbereich gepostet würde, würde ich es positiv bewerten.

    – Benutzer1852050

    19. Februar 2013 um 0:27 Uhr

(struct data*)pointer

wandelt einen Zeiger auf void in einen Zeiger auf um struct data.

  • Vielleicht schlage ich das zu Tode, aber im obigen Beispiel würde dies bedeuten, dass ich Folgendes tun würde, um TYPE val in den Strukturzeiger umzuwandeln, damit ich den Wert abrufen kann, auf den er zeigt: (struct data*)val ? Was genau bewirkt das? Und wenn ich weitermachen und eine Variable ‘int num = (struct* data)val’ deklarieren würde, würde das die Zahl bekommen, auf die val zeigt, oder nur die Speicheradresse, auf die val zeigt? Wenn letzteres, wie kann ich es umwandeln, um den Wert von ‘val’ zu erhalten? Vielen Dank für Ihre Geduld.

    – Benutzer1852050

    18. Februar 2013 um 22:24 Uhr


  • @ user1852050 Sie verwechseln Strukturvariablen und Zeiger-auf-Struktur-Variablen. Wenn Sie einen Zeiger auf eine Struktur benötigen, können Sie die verwenden & Operator.

    – wRAR

    18. Februar 2013 um 22:33 Uhr

  • Also könnte ich Speicher für eine Temp-Struktur deklarieren und zuweisen und ihr dann den Wert von &val geben? Wie in temp = &val. Und dann den Wert mit temp-> value abrufen?

    – Benutzer1852050

    18. Februar 2013 um 22:43 Uhr

  • Du scheinst Hinweise nicht zu verstehen. Hinweise auf Dinge sind wie Adressen von Häusern auf der Straße, aber sie sind nicht die Häuser selbst. Um die Adresse von a zu erhalten house in C tust du es &house. Um das zu bekommen house durch seine Adresse/Zeiger in C tun Sie *pointer. Wenn pointer wurde zuvor als erhalten pointer = &house; und wenn pointer weist auf die Art von hin housedann *pointer ist äquivalent zu *(&house) und letztlich zu house.

    – Alexey Frunze

    18. Februar 2013 um 22:55 Uhr

  • Zeiger auf einen nicht leeren Typ Tim Gegensatz zu Zeigern auf voidkann dereferenziert werden (das haben wir mit gemacht *pointer) und geben dabei ein Objekt vom Typ zurück T. Wenn Sie also einen Zeiger in den Typ von konvertieren house (zeigt auf einen house) auf, sagen wir, Zeiger auf den Typ von castledann erhalten Sie durch Dereferenzieren des konvertierten Zeigers kein Objekt vom Typ castledenn eigentlich zeigt der Zeiger immer noch auf a house.

    – Alexey Frunze

    18. Februar 2013 um 22:57 Uhr


Benutzer-Avatar
Mahadev

Die Typumwandlung eines void-Zeigers auf eine Struktur kann wie folgt durchgeführt werden

void *vptr;
typedef struct data
{
   /* members */
} tdata;

Dazu können wir in eine Struktur umwandeln, sagen wir, Sie möchten diesen vptr als Strukturvariable an eine Funktion senden

dann

void function (tdata *);
main ()
{
    /* here is your function which needs structure pointer 
       type casting void pointer to struct */
    
    function((tdata *) vptr);
}

Hinweis: Wir können void-Zeiger in jeden Typ umwandeln, das ist der Hauptzweck von void-Zeigern.

  • warum wurde das runtergevotet? es bringt ein paar gültige Punkte (zB we can typecast void pointer to any typezum Beispiel), und es beantwortet die Frage (wenn auch nicht sehr klar)

    – Jakob Garby

    4. Juni 2018 um 17:33 Uhr


1382390cookie-checkCasting eines void-Zeigers auf eine Struktur

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

Privacy policy