sizeof() bei verketteten Listen



  • Hallo!

    Es geht um verkettete Listen:
    Wenn ich einen Pointer auf den Typen PLZ habe(PLZ: mit typedef erstellt, es handelt sich um eine struct) und Speicher alloziere, muss ich dann sizeof(PLZ) oder sizeof(PLZ*) schreiben?
    Ich würde sagen sizeof(PLZ) weil ich ja soviel Speicher brauche, wie die struct ausmacht, und nicht soviel, wie ein PLZ-Pointer braucht.

    pointer=(PLZ*)malloc(sizeof(PLZ*));//so
    
    pointer=(PLZ*)malloc(sizeof(PLZ));//oder so???
    

    Danke im Voraus für die Antworten!

    Grüße,
    Harri



  • Das hat erst mal nichts mit verketteten Listen zu tun! Du verlangst Speicher und musst deshalb angeben, wie viel: also "sizeof(PLZ)", du willst die Größe der Struktur, nicht eines Zeigers auf die Struktur!

    Denk dir "malloc" einfach so: "Diese Funktion reserviert Speicher für dich, sag' ihr, wie viel du willst und sie liefert die die Adresse des reserv. Sp. zurück! Ganz einfach und ohne Missverständnisse!



  • Till schrieb:

    du willst die Größe der Struktur, nicht eines Zeigers auf die Struktur!

    ...welche immer gleich ist.



  • Es kommt darauf an, wie du pointer deklariert hast. malloc braucht die Anzahl in Bytes und die bekommst du mit sizeof.

    Wenn du pointer als Pointer deklariert hast, dann muss sizeof(PLZ) Bytes reservieren, weil pointer auf ein PLZ Objekt zeigt

    PLZ* pointer;
    pointer = malloc(sizeof(PLZ));
    

    Wenn du pointer als einen 2-fachen Pointer deklariert hast, dann muss du sieof(PLZ*) Bytes reservieren. pointer ist ein Pointer, der auf einen Pointer zeigt, also musst du so viele Bytes reservieren, die für einen Pointer notwenig sind.

    PLZ** pointer;
    pointer = malloc(sizeof(PLZ*));
    


  • Sorry, das war ein Doppelpost 😡



  • Hallo!

    Danke für die Antworten!

    Ja, ich habs als PLZ *pointer deklariert.

    Das ich dann sizeof(PLZ) brauche hört sich logisch an.

    Was ich aber nicht verstehe: Warum ist der pointer auf PLZ gleich groß wie PLZ selber???

    Grüße,
    Harri



  • harry3 schrieb:

    Was ich aber nicht verstehe: Warum ist der pointer auf PLZ gleich groß wie PLZ selber???

    stimmt natürlich nur wenn PLZ schon ein pointer ist.
    K.



  • Ja eben denn mit malloc(sizeof(PLZ*)) würde ich wahrscheinlich viel zu wenig Speicher reservieren. Weil ein Pointer speichert ja nur die Adresse, während die struct selber ein Array und einen int braucht.

    Noch was: Wenn ich ein struct erstelle, muss schon beim Compilen bekannt sein, wie groß die Strings sind?
    Kann ich das irgendwie umgehen, so dass ich nur einen char Pointer erstelle und sich dieser dann der Größe des tatsächlichen Strings anpasst?

    Oder geht das nicht, weil der Computer genau wissen muss wieviel Speicher er für die structs reservieren muss?

    typedef struct plz
    {
    	char ort[64];//Länge des Strings angegeben
    	int postl;
    	struct plz *next;
    } PLZ;
    
    typedef struct plz
    {
    	char *ort;//Nur char*, Länge erst nachträglich auswählen
    	int postl;
    	struct plz *next;
    } PLZ;
    

    Grüße,
    Harri



  • Du kannst natürlich nur einen char*-Zeiger in der Struktur definieren, doch dann musst du folgendes beachten:

    1. Du musst den String dann dynamisch erzeugen, also per malloc und auch wieder freigeben per free (dafür gibt's ctors in c++ 🙂 )!

    2. Die Struktur ist dann wirklich auch nur int+2*Zeigergröße, also wahrscheinlich 12 Byte groß, eben NICHT so groß wie deine Zeichenkette, die liegt ja dann wo ganz woanders als die Strukturvariable, die nur die Adresse speichert (wichtig eben, falls du serialisieren willst bzw. kopieren willst!)



  • harry3 schrieb:

    Hallo!

    Danke für die Antworten!

    Ja, ich habs als PLZ *pointer deklariert.

    Das ich dann sizeof(PLZ) brauche hört sich logisch an.

    Was ich aber nicht verstehe: Warum ist der pointer auf PLZ gleich groß wie PLZ selber???

    Grüße,
    Harri

    Zufall? Hast du mit sizeof(PLZ) == sizeof(PLZ*) überprüft?



  • Zufall war da schon eher dass das Programm nicht gecrashed ist:
    Die Größe beträgt:
    PLZ*: 4byte
    PLZ: 72byte (!!!)

    Es ist echt erstaunlich, dass ich da niemals in einen Speicher geschrieben habe, der wichtig war. Denn die Differenz zwischen 4 und 72 ist doch ein bisschen gar groß!

    Viele Grüße,
    Harri


Anmelden zum Antworten