Adressbreite und integergröße



  • Danke für die Antworten:)



  • DirkB schrieb:

    Ein Pointer ist kein int.

    Ja.

    DirkB schrieb:

    Ein void Pointer hat auch die gleiche Größe wie ein char* oder int* oder ...*

    So ist die Aussage falsch in Sinne des Standards.
    Garantiert ist nur die verlustfreie Zuweisung eines beliebigen Zeigers nach void* und zurück, nichts weiter.



  • DirkB schrieb:

    Ein void Pointer hat auch die gleiche Größe wie ein char* oder int* oder ...*

    Ist das eigentlich vom Standard garantiert, dass alle Pointertypen gleich groß sind? Eigentlich nicht, oder?

    Soweit mir berichtet wurde, soll es in Prä-Standard-Zeiten mal eine C-Implementierung gegeben haben, bei der sizeof(int*) != sizeof(char*). Ein Pointer auf int soll ein "normaler" Zeiger auf ein Maschinenwort gewesen sein. Ein char-Pointer enthielte dann zusätzlich noch ein Offset um innerhalb des Maschinenworts die einzelnen Bytes zu adressieren. Ich habe mal versucht das ganze zu verifizieren, habe aber nichts konkretes gefunden, außer einen weiteren Hinweis, dass dies eine durchaus mögliche Implementierung für bspw. eine PDP-10 (36-Bit-Worte, nur als solche adressierbar) wäre.

    edit: Ich habe nun mal einen schon länger toten GCC-Port auf die PDP-10 ausgegraben. CHAR_BIT ist dort mit 9 definiert. Wer Interesse daran hat, tiefer zu buddeln:

    http://pdp10.nocrew.org/gcc/

    edit2: Da hat Wutz wohl schon geantwortet, als ich noch geschrieben hatte.

    Wutz schrieb:

    So ist die Aussage falsch in Sinne des Standards.
    Garantiert ist nur die verlustfreie Zuweisung eines beliebigen Zeigers nach void* und zurück, nichts weiter.

    Ja, so war auch mein Kenntnisstand.



  • DirkB schrieb:

    Ein void Pointer hat auch die gleiche Größe wie ein char* oder int* oder ...*

    Ich geh davon aus, dass du da ein «nicht» vergessen hast.

    Es ist soweit ich weiß nur garantiert, dass alle Zeiger auf Strukturen und Unions gleich groß sind.

    Funktionspointer sind dann nochmal ne ganz andere Kiste, die kann man nichtmal verlustlos in void* und zurück konvertieren.



  • Bashar schrieb:

    Es ist soweit ich weiß nur garantiert, dass alle Zeiger auf Strukturen und Unions gleich groß sind.

    Es ist nur garantiert, dass sie JEWEILS die gleiche Bitrepräsentation (abgeleitet davon die gleiche Größe) haben, also nicht beide die gleiche Größe haben.



  • Wutz schrieb:

    Bashar schrieb:

    Es ist soweit ich weiß nur garantiert, dass alle Zeiger auf Strukturen und Unions gleich groß sind.

    Es ist nur garantiert, dass sie JEWEILS die gleiche Bitrepräsentation (abgeleitet davon die gleiche Größe) haben, also nicht beide die gleiche Größe haben.

    Versteh ich nicht. Haben sie nun garantiert die gleiche Größe oder nicht?



  • Gemäß ANSI C:
    Zeiger auf struct haben die gleiche Bitrepräsentation.
    Zeiger auf union haben die gleiche Bitrepräsentation.
    Aus "gleicher Bitrepräsentation" kann man IMHO "gleiche Größe" ableiten.
    Daraus folgt NICHT, dass struct-Zeiger gleich groß zu union-Zeigern sind bzw. gemäß Standard sein müssen.



  • Das heißt wenigstens, alle struct-Zeiger haben die gleiche Größe und alle union-Zeiger haben die gleiche Größe? BTW hast du die Stelle im Standard, an der das steht? Hab ich auf die Schnelle nicht gefunden.



  • ISO/IEC 9899:1999 6.2.4 (26) schrieb:

    A pointer to void shall have the same representation and alignment requirements as a pointer to a character type.39) Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements. All pointers to structure types shall have the same representation and alignment requirements as each other. All pointers to union types shall have the same representation and alignment requirements as each other. Pointers to other types need not have the same representation or alignment requirements.

    39) The same representation and alignment requirements are meant to imply interchangeability as arguments to functions, return values from functions, and members of unions.



  • Entschuldigung, das ist 6.2.5 (26).


Anmelden zum Antworten