Zeiger auf Array von Strukturen (ANSI C)



  • Hallo habe da ein Problem.

    Ich will ein Zeiger auf ein Array von Strukturen deklarieren. In das Array sollen z.B. 100 Elemente (Strukturen) rein.

    Die Bereitstellung des Speichers klappt. Aber egal welche Arraygröße (Anzahl von Elemente) ich festlege (Zeile 6) - die Ausgabe ergibt immer 12Byte / 1 Element (Zeile 12).
    Was mache ich falsch?

    Hier der Codeausschnitt um den es geht:

    int nChips = 0; //Anzahl Elemente
    struct CHIPDATA *chipList; //Struktur wurde woanders deklariert ...
    
    // Anzahl Elemente
    printf("Bitte Anzahl der Chips/Palleten eingeben: ");
    scanf_s("%d",&nChips);
    
    // Speicher bereitstellen
    chipList = (struct CHIPDATA*) malloc(nChips*sizeof(struct CHIPDATA*));
    
    // Größe und Anzahl Elemente ausgeben
    printf("Groesse Struktur: %d Byte | Anzahl Elemente: %d", sizeof(*chipList), sizeof(*chipList)/sizeof(chipList[0])); // Ausgabe: 12 Byte | 1 Element
    


  • Ich glaube nicht das man mit sizeof() die Größe eines dynamisch erstellten Arrays herausfinden kann. Du muß bei Anzahl der Elemente nChips ausgeben.



    1. Wir sind hier im C++-Bereich des Forums. Für ANSI C gibts ein eigenes Unterforum. Warum nimmt sich niemand die 2 Minuten und orientiert sich im Forum? Ich lege dir dringend nahe den Link in meiner Singatur mal durchzulesen.

    2. sizeof ist eine Funktion die zur Compilezeit ausgewertet wird. Sie liefert die Größe des statischen Typs zurück (genauer: eines Objektes des Typs), den der übergebene Ausdruck hat. Im vorliegenden Fall ist der Ausdruck ein dereferenzierter Zeiger auf CHIPDATA, also vom Typ CHIPDATA. Daher liefert sizeof(*chiplist) hier immer das Selbe wie sizeof(struct CHIPDATA).



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • pumuckl schrieb:

    1. sizeof ist eine Funktion die zur Compilezeit ausgewertet wird. Sie liefert die Größe des statischen Typs zurück (genauer: eines Objektes des Typs), den der übergebene Ausdruck hat. Im vorliegenden Fall ist der Ausdruck ein dereferenzierter Zeiger auf CHIPDATA, also vom Typ CHIPDATA. Daher liefert sizeof(*chiplist) hier immer das Selbe wie sizeof(struct CHIPDATA).

    Danke für den Hinweis. Das erklärt die Ausgaben 🙂
    Aber wie kann ich die Größe der gesamten Struktur und deren Elemente ausgeben/ermitteln?



  • sizeof ist eine Funktion die zur Compilezeit ausgewertet wird.

    Das glauben nur die C++-Leute. sizeof ist ein Operator.

    chipList = (struct CHIPDATA*) malloc(nChips*sizeof(struct CHIPDATA*));
    

    Wahrscheinlich nicht so gemeint. sizeof(struct CHIPDATA*) ist die Grösse eines Zeigers auf CHIPDATA. Du willst aber scheinbar die Grösse von CHIPDATA. Die kriegst du mit

    sizeof(struct CHIPDATA)     // Grösse der Struktur CHIPDATA
    // oder gleichwertig
    sizeof(*chipList)           // Grösse des Dings, auf das chipList zeigen kann
    


  • µngbd schrieb:

    chipList = (struct CHIPDATA*) malloc(nChips*sizeof(struct CHIPDATA*));
    

    Wahrscheinlich nicht so gemeint.

    In dem Buch "C von A bis Z" wird das auch so gehandhabt:
    "So wird ein Zeiger temp vom Typ struct adres * definiert:"

    struct adres *temp;
    temp = malloc(sizeof(struct adres *));
    

    --> http://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_006.htm#mj558e0e4fc0892fc3f91cd810f7c07860

    Es klappt ja auch soviel Daten aufzunehmen wie ich will (in meinem Fall also nChips).

    Nur wie kann ich die Größe des Arrays der Struktur ausgeben/ermitteln (lassen)?



  • chipList = (struct CHIPDATA*) malloc(nChips*sizeof(struct CHIPDATA*);
    

    Das ist nicht die richtige Syntax, um Strukturen zu speichern, da ist ganz rechts das Sternchen zuviel.
    Mit obiger Zeile kannst du die Zeiger der Strukturen speichern,
    chipList wäre dann vom Typ struct CHIPDATA**.

    Um die Anzahl nChips Strukturen speichern zu können, benötigst du diese Sytnax:

    int nChips = 100;
    struct CHIPDATA* chipList = malloc(nChips*sizeof(struct CHIPDATA));
    

    Damit erhälst du ein Array, das der Schreibweise

    enum { nChips = 100 };
    struct CHIPDATA chipList[nChips];
    

    entspricht. Die Anwort auf die Frage nach der Größe bzw. nach der Anzahl der
    benötigten Bytes fürs Array dürfte in beiden Fällen klar sein:
    int AnzahlBytes = nChips * sizeof(struct CHIPDATA);

    Mit deiner Zeile könntest du, wie schon erwähnt die Zeiger der Strukturen speichern.
    Die Syntax dafür ist:

    struct CHIPDATA** pchipList = malloc(nChips*sizeof(struct CHIPDATA*));
    

    An der Adresse pchipList könntest du auch nChips Strukturen speichern,
    wenn jede Struktur nicht größer als sizeof(struct CHIPDATA*)
    Bytes ist ( 4 Bytes auf einem 32 Bit Rechner, 8 Bytes auf einem 64 Bit Rechner ).
    Solche Vorgehensweise ist aber nicht sinnvoll.
    Dieser Syntaxfehler ist btw auch dem Autor des von dir verlinkten openbook
    passiert, vllt. sollte man ihm mal mailen.
    Und im übrigen castet man nicht den Rückgabewert von malloc und co. ( für Details, siehe FAQ ).

    Gruß,
    B.B.



  • Vielen Dank Big Brother für die nützlichen Hinweise und Erklärungen.
    Jetzt gibt mein kleines Programm etwas sinnvolles aus 🙂



  • bitti1 schrieb:

    µngbd schrieb:

    chipList = (struct CHIPDATA*) malloc(nChips*sizeof(struct CHIPDATA*));
    

    Wahrscheinlich nicht so gemeint.

    In dem Buch "C von A bis Z" wird das auch so gehandhabt:
    "So wird ein Zeiger temp vom Typ struct adres * definiert:"

    struct adres *temp;
    temp = malloc(sizeof(struct adres *));
    

    --> http://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_006.htm#mj558e0e4fc0892fc3f91cd810f7c07860

    Es klappt ja auch soviel Daten aufzunehmen wie ich will (in meinem Fall also nChips).

    Nur wie kann ich die Größe des Arrays der Struktur ausgeben/ermitteln (lassen)?

    Deshalb sollte man dieses Buch gar nicht lesen, weil es viele solcher Fehler hat. An sich wäre das "einzige" Richtige (damit ist es 'sehr empfehlenswert' gemeint)

    struct adres *temp;
    temp = malloc(sizeof *temp);
    

    Siehe http://www.c-plusplus.net/forum/viewtopic.php?t=206606


Anmelden zum Antworten