C Frage ist folgendes zulässig?

  • C Frage ist folgendes zulässig?

    Es sei der Einfachheit halber folgende structure gegeben:


    struct test { char *name; } structure, *pointer;


    ferner


    pointer = (struct test *) malloc(sizeof(struct test));


    Dann geht es folgendermaßen weiter:


    structure.name=(char *) malloc (sizeof("Emily"+1));


    strcpy (structure.name,"Emily");

    ..

    Folgendes Problem: im ersten malloc wird eine Anzahl von Bytes (bei mir sind es 4) für die struct test reserviert.

    zu diesem Zeitpunkt steht aber noch nicht fest, wie lange der String structure.name wird.

    Die Reservierung von Speicherplatz für "Emily", das sind noch einmal 6 Bytes, also mehr Bytes als die Struktur insgesamt zugewiesen bekommt (Bei mir eben 4 Bytes).

    Insofern sprengt das 2. malloc den Speicherplatz für die Struktur insgesamt (1. malloc).

    Daher frage ich mich, ob das überhaupt so zulässig ist.
  • MOS schrieb:

    Die Reservierung von Speicherplatz für "Emily", das sind noch einmal 6 Bytes, also mehr Bytes als die Struktur insgesamt zugewiesen bekommt (Bei mir eben 4 Bytes).

    Insofern sprengt das 2. malloc den Speicherplatz für die Struktur insgesamt (1. malloc).
    Die Speicheranforderung für den String hat nichts mit dem Speicherplatz für die struct zu tun - der String steht ja gar nicht in der struct drin.

    Quellcode

    1. 10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    2. 20 forj=1to5:printchr$(rnd(1)*16+70);:next
    3. 30 printint(rnd(1)*328)-217

    sd2iec Homepage
  • Soweit ich es überblicke, reserviert das erste "malloc" den Speicher für ein "struct test", und das sind je nach Plattform 2, 4, oder 8 bytes (wie lange halt ein Pointer jeweils ist). Die erhaltene Addresse wird in der Variable "pointer" festgehalten, die tatsächlich auch als Pointer auf ein "struct test" deklariert ist.

    Das zweite malloc reserviert Speicher für einen String "Emily" (nicht für ein zweites struct test! das ist mit dem Namen "structure" schon vorhanden!), und schreibt die so erhaltene Addresse in das bereits definierte "structure.name". Durch die Deklaration (ohne *) wurde vorher der Speicher für "structure" bereits reserviert, und die Verwendung greift direkt auf das struct zu.

    Was wir jetzt haben, sind zwei "struct test", wobei das eine direkt auf dem Stack definiert ist (Deklaration von "structure"), das zweite aber auf dem Heap (über malloc, wobei "pointer" die Addresse enthält).

    Dann wird mit der strcpy-Funktion dem vorher grad reservierten String-Speicherbereich, dessen Adresse in "struct.name" steht, byte für byte der Inhalt der String-Konstante "Emily" zugewiesen (er ist ja dank malloc groß genug), während der "pointer" gar nicht mehr benutzt wird (zumindest in dem hier sichtbaren Teil des Beispiels).
  • Genau - wie ich schon geschrieben habe:

    markusC64 schrieb:

    Nur musst du bedeneken, dass in den allozerten Bereich structure.name nur ein Pointer auf einen weiteren zu allozerenden String ist.
    ---
    Meine Github-Projekte: github.com/markusC64/
    1541 Ultimate II Firmware Releases: github.com/markusC64/1541ultimate2/releases
    1541 Ultimate II Update instructions: github.com/markusC64/1541ultimate2/wiki
  • Benutzer online 1

    1 Besucher