Variable struct-Größe durch Sizeof ermittelt.



  • Hallo,

    ich habe mir mal ein struct definiert und wollte dessen Größe in Byte ermitteln. Nachdem ich mit calloc mehrere davon erstellt habe.

    #include <stdio.h>
    #include <stdlib.h>
    
    struct liste_t {
    int val;
    struct liste_t* next;
    };
    typedef struct liste_t liste_t;
    
    int main()
    {
        liste_t *ptr = calloc(5, sizeof(liste_t));
    
        printf("Bytes: %d\n", sizeof(liste_t));
        printf("Bytes: %d\n", calloc(5, sizeof(liste_t)));
        printf("Bytes: %d\n", *ptr);
        return 0;
    }
    

    Das Ergebnis verwirrt mich jedoch.

    Byte: 8
    Byte: 671212
    Byte: 0
    

    Einerseits passt die Größe überhaupt nicht, andererseits ändert sich die mittlere Zahl ständig wenn man es nochmal ausführt.
    Dachte zuerst ich lasse mir die Adresse anzeigen, aber die dritte Zeile sollte ja dann eigentlich die richtige Größe anzeigen. Oder konnte mir calloc keinen Speicherplatz reservieren ?

    Danke
    mfg werdas34


  • Mod

    Alles was du annimmst, war falsch.

    Das struct ist immer gleich groß: Größe von int + Größe von Pointer + eventuell Padding

    Das was du beim zweiten Ausgibst ist der Rückgabewert von calloc, also der Wert eines Zeigers, hier als int angezeigt.

    Und beim letzten Mal gibst du das aus, worauf ptr zeigt, als int, also das gerade neu angelegte struct der Member val davon (weil das der erste Member ist), was hier zufällig 0 ist.

    Vieles davon ist auch undefiniertes Verhalten, was du hier erzeugst. Z.B. die Ausgabe eines Pointers per int. Die letzte Ausgabe ist auch sehr gewagt, aber passt. Ist aber wohl eher zufällig richtig und nicht von dir beabsichtigt.



  • werdas34 schrieb:

    Das Ergebnis verwirrt mich jedoch.

    Byte: 8
    Byte: 671212
    Byte: 0
    

    8: int entspricht (meistens) 4 byte, adressbreite (sizeof zeiger) bei 32 bit auch. wenn du als x64 compilierst, bekommst du hier bestimmt 12 als ergebnis.

    671212: das ist die adresse der ersten struktur, da calloc nun einmal eine adresse zurück liefert. nebenbei müllst du dir den speicher zu, da die adresse verloren geht und der speicher nur am ende des programms oder durch aufruf von free() wieder freigegeben wird, da du die adresse allerdings verworfen (weil nirgends gespeichert) hast, kannst du free() auch nicht aufrufen.

    0: im prinzip sagst du printf, dass es den wert der datenstruktur liefern soll. also vom prinzip her nicht "liefere anzahl an bananen" sondern "liefere banane".
    wenn du die adresse haben willst, solltest du also printf("%p", ptr) aufrufen..



  • Die alloc-Funktionen liefern die Anfangsadresse vom reservierten Speicher.
    Darum arbeitest du da auch mit Zeiger/Pointer.

    Nur über einen Zeiger kommst du in C nicht an die Größe des dahinter reservierten Speichers.
    Die musst du dir extra merken.

    Die alloc-Funktionen müssen das zwar intern machen, da kommt man aber mit Standardmitteln nicht dran.

    Der letzte Wert ist 0, weil du den Speicher mit calloc besorgt hast.


Anmelden zum Antworten