c: Hohlraumgröße*

Lesezeit: 4 Minuten

Benutzer-Avatar
facha

Ich bin ein bisschen verwirrt mit einem void * -Zeiger in C. Besonders nachdem ich diese Frage gelesen habe: Ist die Größe von (einem Zeiger) immer gleich vier?, wo eine Person sagt, dass es keine Garantie dafür gibt, dass Größe von (int *) == Größe von (doppelt *)

Meine Frage ist: Gibt es eine Garantie für sizeof(void*) >= sizeof(irgendein anderer Zeigertyp)? Mit anderen Worten, kann ich einem void*-Zeiger immer einen some_type*-Zeiger zuweisen und ihn dann als some_type* zurückbekommen?

Nur Datenzeiger. void * kann beliebige Datenzeiger enthalten, aber keine Funktionszeiger.

Hier ist ein C-Häufig gestellte Fragen.

void *’s enthalten garantiert nur Objektzeiger (dh Datenzeiger); Es ist nicht portierbar, einen Funktionszeiger in den Typ void * umzuwandeln. (Auf einigen Maschinen können Funktionsadressen sehr groß sein, größer als alle Datenzeiger.)

Was den ersten Teil betrifft, ja, es können verschiedene Typen vorhanden sein Zeiger unterschiedlicher Größe:

  • Zeiger unterschiedlicher Größe sind jedoch in modernen Systemen selten bis nicht vorhanden.

    – Greg Hewgill

    2. August 2011 um 8:02 Uhr

  • Und notieren Sie „kann halten“, nicht „ist mindestens so groß“. In der Norm steht z.B. nichts, double* Zeiger können nicht verschwenderisch groß sein und einige ihrer Bits einfach nicht verwenden. Du könntest haben sizeof(double*) > sizeof(void*) obwohl ein void* kann jeden Wert von halten double*.

    – Steve Jessop

    2. August 2011 um 8:57 Uhr

  • noch keine Argumente haben mich überzeugt (natürlich ist std die Bibel, aber es kann schlecht gestaltet sein): es muss ein “Register” geben, das in der Lage ist, den “größten” “Zeiger” zu halten; und ich erwarte, dass “void *” eine “Vereinigung” aller möglichen Zeiger ist, so dass es für echte “Zeiger auf irgendetwas” bedeuten kann. Bevor ich es verwenden kann, muss ich es gießen, und dann muss es eine “bestimmte Form” annehmen. Aber sizeof(void *) sollte die Größe des “größten” geben, der auch Funktionszeiger behalten kann (was auch immer sie sind).

    – Shin Takezou

    2. August 2011 um 9:41 Uhr

  • @ShinTakezou: Ein Gegenbeispiel wäre ein System, in dem Zeiger nicht sehr kompakt sind, z. B. klassisches x86: Sie benötigen einen 16 + 16-Bit-Zeiger, wenn Sie sie dereferenzieren, aber sie enthalten nur 20 Bit Informationen. Da dereferenziert man nie void*das muss nicht 32 Bit sein, könnte aber 24 Bit sein.

    – MSalter

    2. August 2011 um 10:29 Uhr

  • In diesem Zusammenhang ist bemerkenswert, dass POSIX diesen Punkt des C-Standards eklatant verletzt, indem es dies verlangt void* kann tatsächlich einen Methodenzeiger enthalten.

    – Konrad Rudolf

    2. August 2011 um 12:43 Uhr

Der im Zeiger gespeicherte Wert ist eine Speicheradresse. Wenn Sie sich auf einem 32-Bit-System befinden, ist dieser Zeiger in den Speicher 32 Bit (oder vier Byte) lang. Wenn Sie sich auf einem 64-Bit-System befinden, ist dieser Zeiger in den Speicher 64 Bit (oder acht Byte) lang.

Die Größe der Daten, die den Ort im Speicher enthalten, hat nichts mit der Größe der Daten zu tun, die an diesem Ort im Speicher dargestellt werden.

Wie ein char * unterscheidet sich von a double *das char * kann auf jeden Ort zeigen, aber die double * muss auf etwas entlang einer 8-Byte-Grenze zeigen. Größere Daten müssen gemäß den Regeln des Auftragsverarbeiters ausgerichtet werden, bei dem Sie sich befinden. Daher sind Zeiger auf kleine Daten im Allgemeinen nicht kompatibel mit Zeigern auf große Daten (z. B. sollten Sie nicht auf a zeigen double * Zeiger auf a char * die Anschrift); aber Sie können sicher in die andere Richtung gehen (z. B. können Sie a zeigen char * Zeiger auf a double * die Anschrift).

  • Dies ist eine gute praktische Antwort, aber es sieht so aus, als ob das OP nach einer standardpedantischen Antwort sucht.

    – Chris Lutz

    2. August 2011 um 7:45 Uhr

  • Wie Chris sagte. Was Sie hier ausdrücken, ist das, was uns die Praxis sagt, aber was den Sprachstandard betrifft, sind alle Wetten abgeschlossen. 😉

    – DevSolar

    2. August 2011 um 7:49 Uhr

  • Die Sprachregeln sind, was sie sollen ermöglichen Implementierungen auf Systemen, bei denen die Adressierung nicht regelmäßig ist. Die Sprachdesigner haben dies absichtlich getan.

    – Bo Persson

    2. August 2011 um 9:01 Uhr

  • +1 . Die Ausrichtung ist jedoch nicht bei allen möglichen Maschinen erforderlich; obwohl es sehr häufig vorkommt (dh es ist so); zB wenn ich mich gut erinnere, kann 68020 auf ungerade Adressen zugreifen, während Wort (16) oder Langwort (32) Daten gelesen werden, obwohl der Zugriff langsamer ist (und so wird das Ausrichten von Daten Ihr Programm schneller laufen lassen).

    – Shin Takezou

    2. August 2011 um 9:45 Uhr

  • Ich brauche ein Beispiel für Systeme, bei denen die Adressierung “nicht regelmäßig ist”. und die Sprache kann es nicht verbergen (der einzige Grund, warum ich akzeptieren kann, dass Standardautoren das so geschrieben haben, ist, dass das Verbergen und Zulassen der “intuitiven” Tatsache, dass ein Zeiger ein Zeiger ist, egal worauf, unmöglich gewesen wäre … )

    – Shin Takezou

    2. August 2011 um 9:48 Uhr

1382680cookie-checkc: Hohlraumgröße*

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

Privacy policy