Dynamisch Speicher allokieren



  • Hey,

    ich habe folgenden Code:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define MAX 5
    
    int main (int argc, char *argv[])
    {
      char *eingabe = NULL;                       // Pointer mit NULL initialisieren
      char Puffer[MAX];                           // Zwischenspeichern der Eingabe
    
      fgets(Puffer, MAX, stdin);                  // String einlesen
      eingabe = malloc(strlen(Puffer)+1);         // Ausreichen Speicher allokieren
      strcpy(eingabe,Puffer);                     // Zwischengespeichertes in allokierten Speicher laden
    
    // Endlosschleife
      while(1)
      {
        fgets(Puffer, MAX,stdin);                                              // Nächste Eingabe
    
        if ( strcmp(Puffer, "end\n") == 0 ) break;                             // Beenden durch User
    
        eingabe = realloc(eingabe,strlen(eingabe) + strlen(Puffer) + 1);       // Neuen Speicher ranschaffen
        strcat(eingabe, Puffer);                                               // Hinten dran hängen
    
    }
    
    printf("Der eingegeben Text: \n\n%s", eingabe);
    return 0;
    }
    

    Wie man sieht, wird die Eingabe erst in ein Pufferarray gespeichert und dann wird dementsprechend Speicherplatz alloziert und dann wird die Anfangsadresse des allokierten Speichers dem Pointer eingabe mitgegeben. Nun habe ich das Pufferarray hier 5 Elemente groß gemacht. Wenn meine Eingabe aber nun länger als 5 Buchstaben ist, geht es trotzdem aber müsste da nicht ein Fehler auftreten?



  • fgets liest max 5 Zeichen ein.
    Wenn du mehr eingibst, werden die restlichen Zeichen im den nächsten Durchläufen eingelesen.

    Bau doch eine Zählvariable ein, die bei jedem Durchlauf erhöht wird, und gib sie mit dem Pufferinhalt aus.

    int i = 0;
    while...
    
    /* Zeile 20*/  printf("Durchlauf %3d: <%s>\n", ++i, Puffer);
    


  • Also brauche ich keine Angst haben, dass irgendein Speicherplatz überschrieben wird, der nicht meinem Programm gehört?



  • wenn (re)malloc NULL zurückgibt schon. 😉



  • Generell ist

    eingabe = realloc(eingabe, ...);
    

    eine gefährliche Konstruktion; du kannst damit Speicher lecken (und das gerade dann, wenn er eh schon knapp zu sein scheint!). Besser:

    void *neu = realloc(eingabe, ...);
    
    if(NULL == neu) {
      free(eingabe); /* ! */
    
      /* Weitere Fehlerbehandlung */
    } else {
      eingabe = neu;
    }
    


  • ITrun90 schrieb:

    Also brauche ich keine Angst haben, dass irgendein Speicherplatz überschrieben wird, der nicht meinem Programm gehört?

    Wenn du tatsächlich von der Tastatur einlesen lässt, kannst du das so machen, die Gefahr eines Speichermangels bei realloc=>NULL ist verschwindend gering gehen die einer Sehnenscheidenentzündung.
    Ein abschließendes free hast du noch vergessen.


Anmelden zum Antworten