Verständnisproblem: Zeiger auf Zeiger oder doppelte Indirektion



  • MaDsTyLe schrieb:

    Sei Z die (nicht-endliche) Menge aller denkbaren Daten-Zeigertypen, so gilt folgende Aussage:

    ∀ x,y ∈ Z: sizeof x = sizeof y

    Diese verkürzte Aussage ist falsch.
    Der ANSI C Sprachstandard definiert nicht explizit die Größe von Zeigern, er spricht nur von gleicher Repräsentation (inkl. Alignment). Hieraus kann man sizeof-Aussagen ableiten. Und der Standard garantiert für o.g. Zeiger auf Zeiger nichts (unspezifiziert) ebenso nichts für Zeiger auf Funktionen (wer doch was hierzu findet, bitte melden).
    Der Standard garantiert dieselbe Repräsentation von char*, signed char*, unsigned char* und void*. Daraus kann man ableiten, dass sizeof(char*)==sizeof(signed char*)==sizeof(unsigned char*)==sizeof(void*) ist.
    Weiterhin garantiert der Standard, dass alle Zeiger auf alle struct sowie alle Zeiger auf alle union jeweils die gleiche Repräsentation haben, woraus man ableiten kann, dass sizeof(struct A*)==sizeof(struct B*),sizeof(union A*)==sizeof(union B*) aber sizeof(struct A*)??sizeof(union B*).
    Weiterhin garantiert der Sprachstandard, dass jeder Zeiger (verlustfrei) nach void* konvertiert werden kann und wieder zurück zum Original. Hierbei wie gesagt wird keine gleiche Repräsentation garantiert, nur die verlustfreie Hin/Rück-Konvertierung. Demzufolge gilt für alle außer den 3 o.g. Typen: sizeof(keinchartyp*)??sizeof(void*), bzw. wenn man nicht ganz so streng ist, vielleicht noch sizeof(keinchartyp*)<=sizeof(void*) bzw. sizeof(keinchartyp*)<=sizeof(chartyp*).


Anmelden zum Antworten