Dynamische Speicherreservierung bei Strings



  • Achso ah ok danke kapier endlich was es mit diesen Zeigern und dynamischem Speicher auf sich hat dake 🙂

    So in etwa?:

    /* Woerterliste.c */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
        char **dyn_array[800];
        char eingabe[20];
        int i;
        int anz_woerter = 20;
    
        printf("Geben Sie Ihre  Woerter ein: \n");
        for(i=0; i<5; i++)
        {
    
            fgets(eingabe, 20, stdin);
            dyn_array[i] = (char**)malloc(anz_woerter*sizeof(*dyn_array));
            if(dyn_array != NULL)
                strcpy(dyn_array[i], eingabe);
        }
    
        for(i=0; i < 5; i++)
            printf("%s", dyn_array[i]);
    
        return EXIT_SUCCESS;
    }
    

    -GhostfaceChilla-



  • Nix verstanden.
    Dreifach Indirektionen sind wohl doch etwas viel für den Anfang, manche begreifen es nie.



  • So besser??

    /* Woerterliste.c */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
        char *dyn_array[800];
        char eingabe[20];
        int i;
    
        printf("Geben Sie Ihre  Woerter ein: \n");
        for(i=0; i<5; i++)
        {
            fgets(eingabe, 20, stdin);
            dyn_array[i] = malloc(strlen(eingabe));
            if(dyn_array != NULL)
            {
                strcpy(dyn_array, eingabe);
                if( strstr(dyn_array,eingabe) != NULL)                  /* Funktioniert noch nicht, muss noch gucken */
                    printf("Wort wurde bereits eingegeben!Neueingab!"   /* wie das funktioniert arrays mit strings zu vergleichen */  
            }
            else
            {
                printf("ERROR!Kein virtueller Speicher mehr vorhanden!!");
                return EXIT_FAILURE;
            }
        }
    
        for(i=0; i < 5; i++)
            printf("%s", dyn_array[i]);
    
        return EXIT_SUCCESS;
    }
    


  • http://ideone.com/6cEE7

    Sonst wird das heute nichts mehr.



  • Als Ergänzung:
    Ich lege jetzt mal für dieses Beispiel fest, dass ein char 1 Byte und ein Zeiger 4 Byte lang ist.

    char woerter[800][20]; // Platz für 800 Wörter, die 19 Zeichen lang sein dürfen.
    

    Das sind 800 * 20 Byte = 16000 Byte.

    char *woerter[800]   // Zeiger für 800 Wörter, die (fast) beliebig lang sein dürfen.
    

    Das sind 800 * 4 Byte für die Zeiger + der Speicher für den Text. Wenn das auch 20 Zeichen sind ergibt sich 800 * 4 + 800 * 20 = 19200 Byte.

    char **woerter = (char **)malloc(anz_woerter * sizeof(*woerter)); // (fast) beliebig lange Liste mit Zeigern auf (fast) beliebig lange Wörter
    

    Da kommen noch 4 Byte für den Zeiger woerter dazu, das ergibt dann 19204 Byte

    Dynamischen Speicher nimmst du dann, wenn du zur Compilezeit nicht abschätzen kannst wie viel Daten du verarbeiten musst oder wenn die Datenmenge zu groß für den Stack ist.



  • An der Stelle sei auch mal http://www.cdecl.org/ erwähnt. Das hilft imo sehr, tieferes Verständnis für die Materie zu entwickeln 🙂



  • Danke für die antworten.
    So aber was ist denn jetzt genau an meinem Code falsch??

    -GhostfaceChilla-



  • In Zeile 17 forderst du zu wenig Speicher an.

    In Zeile 17 (und 32) behandelts du dyn_array richtig. in Zeile 18, 20 und 21 schon nicht mehr.

    dyn_array ist eine Liste, die auf die Strings verweist.
    Du kannst nicht mit einem Vergleich schauen ob das Wort schon eingegeben wurde. Du musst das schon mit allen Einträgen vergleichen.
    (Ja, in einer Schleife, jeden Eintrag einzeln.)



  • @Wutz:
    Was bringt dir in deinem Quellcode folgendes.

    while( w-- )
    

    ??
    Das kann ja gar keine while-Schleife sein oder?Hier wird ja keine Bedingung überprüft.

    -GhostfaceChilla-



  • Natürlich wird hier eine Bedingung geprüft. Was hier steht, ist dasselbe wie while(w-- != 0).
    Du kannst statt if(x != 0), while(x != 0),... auch if(x), while(x),... schreiben 😉



  • Habs eben gegoogelt und hab herausgefunden wie es funktioniert 🙂
    D.h also es überprüft solange bis w= 0 ist stimmts?

    -GhostfaceChilla-



  • Wenn w == 0 ist, bricht die Schleife sofort ab und nichts passiert, ansonsten wird heruntergezählt bis 0 und der Schleifenblock jeweils mit w-1 bedient.


Anmelden zum Antworten