Länge eines **char arrays ermitteln?



  • Hab erst vor kurzem angefangen in C zu programmieren und auch schon die ersten Fragen...

    1. Wenn ich ein Zeiger auf Zeiger Array habe, wie kann ich die Grösse des Arrays bestimmen, d.h. im untenstehenden Beispiel auslesen wieviele Sprachen der Mitarbeiter foo spricht? sizeof(foo.sprachen) liefert mir ja nur die Grösse des Pointers. Oder ist die einzige Möglichkeit, die Anzahl Sprachen in einer zusätzlichen Variablen fortzuschreiben?
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct mitarbeiter
    {
            int mitarbeiter_nr; 
            char **sprachen;
    };
    
    int main(void)
    {
            struct mitarbeiter foo;
            int i;
    
            foo.mitarbeiter_nr = 4711;
            for (i = 0; i < 10; i++)
            {
                    foo.sprachen[i] = malloc(20 * sizeof(char));
                    strcpy(foo.sprachen[i], "Sprache");
                    printf("%s\n", foo.sprachen[i]);
            }
            return 0;
    }
    
    1. In Situationen wie im Beispiel oben (Mitarbeiter spricht mehrere Sprachen, Student besucht mehrere Fächer, usw.), welche Datenstruktur würdet ihe wählen?
      - Zeiger Array (resp. Zeiger auf Zeiger Array)
      - Verkettete Liste
      - Bitfeld um Flags pro Sprache zu setzen

    Oder seh ich jetzt den Wald vor lauter Bäumen nicht mehr und das ganze geht auch viel enfacher?

    Danke für Eure Antworten!



  • Der letzte Eintrag sollte einen NULL-Zeiger enthalten.

    Wird auch so bei den Parmetern argv und env von main gemacht.



  • Du solltest auch foo.sprachen initialisieren (foo.sprachen = malloc(10 * sizeof(void*)) und nicht nur foo.sprachen[i], sonst hagelt's Access Violations.



  • hitsch schrieb:

    1. Wenn ich ein Zeiger auf Zeiger Array habe

    Ich sehe nirgendwo in deinem Code einen Zeiger auf Zeiger Array definiert.
    Schreibe dir für deine Anwendungsfälle jeweils eine Funktion, der du jeweils auch das Structzeiger-Array übergibst. Dann ist es eine Frage des Geschmacks, ob die die Größe deines Structzeiger-Arrays extern pflegst und jeweils mit übergibst, oder als Ende den letzten Structzeiger mit NULL belegst.

    also z.B.

    typedef struct {int i;char**s;} MeinTyp;
    
    int neu(MeinTyp **liste,MeinTyp eintrag);
    int loescheWert(MeinTyp **liste,MeinTyp eintrag);
    int loescheBei(MeinTyp **liste,int index);
    int loop(MeinTyp **liste,void (*fkt)(MeinTyp *eintrag,int index,int groesse));
    ... usw.
    

    Zu deiner eigentlichen Frage:

    Länge eines **char arrays ermitteln?
    

    Nein, das ist nicht möglich.



  • DirkB schrieb:

    Der letzte Eintrag sollte einen NULL-Zeiger enthalten.

    Danke, klappt wunderbar!

    wxSkip schrieb:

    Du solltest auch foo.sprachen initialisieren (foo.sprachen = malloc(10 * sizeof(void*)) und nicht nur foo.sprachen[i], sonst hagelt's Access Violations.

    Hatte ich total vergessen 😞 . Was ich mich jetzt aber frage: Warum hat void* eine Grösse? Hätte selbst nämlich sizeof(int*) verwendet.



  • hitsch schrieb:

    Was ich mich jetzt aber frage: Warum hat void* eine Grösse? Hätte selbst nämlich sizeof(int*) verwendet.

    Weil void* ein Zeiger ist. Und Zeiger belegen Speicheplatz.
    Du kannst ja mal spaßeshalber die Größe der einzelen Zeiger vergleichen, also long*, char*, double*, .... .


Log in to reply