Array dynamisch vergrößern



  • Hallo!

    Ich habe folgendes Problem mit dem unten angegebenen Programm. Eine Datei soll über den stdin eingelesen, sortiert und wieder ausgegeben werden. Das Programm funktioniert auch wunderbar, aber nur wenn ich die - auskommentierte - malloc Zeile verwende. Sobald ich die, mit einem Pfeil markierte, Zeile mit realloc einfüge funktioniert das Programm nicht mehr (malloc ist auskommentiert). Kommentiere ich die realloc Zeile aus und verwende wieder die feste Array Größe klappt alles wunderbar.

    Sieht vielleicht jemand wo es klemmt?

    Wäre für Hilfe dankbar!

    char **ptra = NULL ;
    
    int main(int argc, char *argv[])
    {
       int zeilenZahl = 0;
    
        /* ptra = (char **) malloc (10000 * sizeof(char *)); */
    
        zeilenZahl = liesDateiEin();
        printf("Anzahl der ausgelesenen Zeilen: %d\n", zeilenZahl);
        qsort(ptra, zeilenZahl, sizeof (char*), vergleich);
        gibDateiAus(ptra, zeilenZahl);
      }
    
      return 0;
    }
    
    int liesDateiEin() {
         char daten[102];
         char *p;
         int zeilenZaehler = 0;
         int laenge = 0;
    
         while( fgets(daten, 102, stdin)){
    
           if(daten[0] == '\n') {
             continue;
            }
    
            if(laenge > 100) {
              printf("Zu langes Wort geflitert\n");
               while(getchar() != '\n');
              continue;
            }
    
            p = (char *) malloc (strlen(daten) * sizeof (char));
            laenge = strlen(daten);
            daten[laenge - 1] = '\0';
            strcpy(p,daten);
            ptra = (char **) realloc (ptra, zeilenZaehler * sizeof(char *)); <----
            ptra[zeilenZaehler++] = p;
    
         }
         return zeilenZaehler;
    }
    


  • für jede zeile ein char reservieren wird nicht reichen 😉
    machs mal so:

    ptra = (char **) realloc (ptra, strlen(daten) * sizeof(char *));
    


  • @T_B_C
    nach deinem realloc() musst du noch ein malloc() machen. Du hast zwar dein Zeiger-Array vergrößert und dafür Speicher reserviert, aber noch nicht dein Char-Array in dem dein Text gespeichert werden soll. Außerdem ist noch ein kleiner Logikfehler drin. Überleg mal welchen Wert zeilenZaehler beim ersten durchlauf hat und wieviel Speicher dann reserviert werden soll ;).

    Das malloc() nach deinem realloc() sollte so aussehen:

    ...
    ptra[zeilenZaehler] = malloc(laenge + 1);
    ...
    

    Mir ist noch aufgefallen, dass du einfach das letzte Zeichen löschst, dass eingelesen wurde. Ich denke mir mal, dass du den Zeilenumbruch rauslöschen willst am Ende, aber was machst du wenn mal kein Zeilenumbruch am Ende steht?? (Sollte man schon abprüfen, was man löschen möchte)



  • Oh stimmt! Danke!

    Ich habe das jetzt mal so probiert und es funzt einwandfrei ... es war nur noch ein kleiner Fehler drinnen ... nach langen suchen viel mir auf das die Zeile:

    ptra = (char **) realloc (ptra, strlen(daten) * sizeof(char *));
    

    noch nicht korrekt ist ... ich zu muss zu strlen(daten) noch + 1 aufaddieren damit noch platz für den 0-Byte-Character ist ...

    Danke noch mal!


Anmelden zum Antworten