Warum geben Sie einen void-Zeiger ein?

Lesezeit: 3 Minuten

Benutzer-Avatar
Ann

Da ich neu in C bin, habe ich void-Zeiger nur für vielseitige Funktionen verwendet, die verschiedene Datentypen in einem bestimmten Zeiger speichern können. Daher habe ich meinen Zeiger bei der Speicherzuweisung nicht typisiert.

Ich habe einige Codebeispiele gesehen, die manchmal void-Zeiger verwenden, aber sie werden typgewandelt. Warum ist das nützlich? Warum nicht direkt den gewünschten Zeigertyp anstelle einer Leerstelle erstellen?

  • Können Sie ein Beispiel zeigen?

    – Oliver Charlesworth

    7. Juni 2013 um 14:12 Uhr

  • Sie brauchen nicht zu werfen void* denn die Sprache definiert eine automatische Konvertierung von void* auf jede andere Art von Zeiger, aber nicht alle Programmierer sind sich dessen bewusst (leider nicht einmal alle C-Buch-Autoren).

    – Fred Foo

    7. Juni 2013 um 14:14 Uhr

  • @larsmans Genauer gesagt definiert der C-Standard die implizite Kompatibilität zwischen void * alle Daten Zeigertypen. Funktionszeiger sind aus dem Spiel (wenn Ihr System jedoch POSIX ist und warum sollte ein vernünftiger Programmierer etwas verwenden, das nicht POSIX ist, dann sind Funktionszeiger kompatibel mit void * zu).

    Benutzer529758

    7. Juni 2013 um 14:33 Uhr


  • Das könnte hier relevant sein.

    – Millenniumbug

    7. Juni 2013 um 14:41 Uhr

  • Es ist „Code“, nicht „Codes“.

    Benutzer405725

    7. Juni 2013 um 14:46 Uhr


Benutzer-Avatar
Wolfgang

Es gibt zwei Gründe dafür, einen void-Zeiger in einen anderen Typ in C umzuwandeln.

  1. Wenn Sie auf etwas zugreifen möchten, auf das der Zeiger zeigt ( *(int*)p = 42 )
  2. Wenn Sie tatsächlich Code in der gemeinsamen Teilmenge von C und C++ schreiben und nicht in “echtem” C. Siehe auch Kann ich das Ergebnis von malloc umwandeln?

Der Grund für 1 sollte offensichtlich sein. Nummer zwei ist, weil C++ die implizite Konvertierung von nicht zulässt void* zu anderen Typen, während C es zulässt.

  • Aber Argument 2 ist ungültig: Man sollte C-Code nicht mit einem C++-Compiler kompilieren.

    Benutzer529758

    7. Juni 2013 um 14:45 Uhr

  • @H2Co3: Stimmt, aber manchmal haben Sie Code in Header-Dateien in Makros oder Inline-Funktionen definiert, der sowohl in C- als auch in C++-Code verwendet werden soll, der diese Header enthält.

    – Adam Rosenfield

    7. Juni 2013 um 14:47 Uhr

  • @H2CO3 Trotzdem tun es einige Leute. Ich habe versucht, das Phänomen zu erklären, nicht zu rechtfertigen.

    – wolfgang

    7. Juni 2013 um 14:49 Uhr

  • 3. Grund: Sie werden durch eine hirntote Codierungsrichtlinie gezwungen. s/implizite Umwandlung/implizite Konvertierung/

    – undur_gongor

    7. Juni 2013 um 14:57 Uhr


  • Grund 3: Um Leuten zu sagen, die sich Ihren Code ansehen, dass dieser Speicherbereich von diesem Typ ist, da a->b = malloc(sizeof(*a->b)) sagt nichts während a->b = (struct Monster*)malloc(sizeof(*a->b)) tut.

    – xryl669

    13. Januar um 11:34 Uhr

Sie müssen void-Zeiger auf etwas anderes umwandeln, wenn Sie sie dereferenzieren möchten. Sie erhalten beispielsweise einen void-Zeiger als Funktionsparameter und wissen mit Sicherheit, dass dies eine Ganzzahl ist:

void some_function(void * some_param) {
    int some_value = *some_param; /* won't work, you can't dereference a void pointer */
}

void some_function(void * some_param) {
    int some_value = *((int *) some_param); /* ok */
}

  • Du nicht müssen; ein besser lesbarer (von mir bevorzugter) Ansatz ist int *tmp = param; int val = *tmp;.

    Benutzer529758

    7. Juni 2013 um 14:38 Uhr


  • @H2CO3 Sie müssen, wenn der Zeiger ein void-Typ ist. Wie in Guillaumes Beispiel.

    Benutzer1944441

    7. Juni 2013 um 14:42 Uhr

  • @Armin Tust du nicht müssen, zu … haben, Ich wiederhole – der Cast kann vermieden werden, wenn Sie den Zeiger einem temporären zuweisen.

    Benutzer529758

    7. Juni 2013 um 14:43 Uhr

  • @ H2CO3 Aber du müssen, zu … haben wenn Sie kein temp verwenden, wie in seinem Beispiel gezeigt.

    Benutzer1944441

    7. Juni 2013 um 14:44 Uhr

  • @Armin Das stimmt, aber das sage ich nicht – ich schlage eher vor, dass es nicht global unvermeidlich ist.

    Benutzer529758

    7. Juni 2013 um 14:45 Uhr

1370790cookie-checkWarum geben Sie einen void-Zeiger ein?

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

Privacy policy