Fehler bei einer Array-Befüllung



  • Hallo miteinander!

    Hab da eine nette Aufgabe zugeteilt bekommen welche da sagt, dass ich ein Array über eine exterene Funktion befühllen soll. Soweit ja kein Problem, nur weiß ich die Anzahl der Einträge vorab nicht und ich darf noch nicht mit Strings arbeiten. Jetzt hab ich mir eine Funktion mit malloc/realloc gebaut und irgendwie bekomme ich jetzt Speicherfehler beim Ausführen meines Codes. Probiere jetzt schon knapp eine Woche herum, aber ich komme nicht auf den Fehler.

    #include <stdio.h>
    #include <stdlib.h>
    
    //this function deals with the text input
    int insertion(char *text, unsigned int *counter)
    {
    int max = 10; 
    char *buffer;
    text = malloc (max* sizeof(char));
    printf("created basic memory\n");
      if (text == NULL)
      {
        printf("failure in locating memory\n");
        return -2;
      }
      while (text[*counter] != EOF)
      {
        text[*counter] = getchar();
    
        if ((*counter) > max)
        {
          max = max + 10;
          buffer = realloc (text, max * sizeof(char));
          printf("created some extra memory\n");
          if (buffer == NULL)
          {
            printf("[ERROR]memory extension failed\n");
            free(buffer);
            return -2;
          }
          text = buffer;
          free(buffer);
        }
        (*counter)++;
      }    
      if (text[0] == EOF)
      {
        printf("[ERROR]no text\n");
        return -1;
      }
    return 0;
    }
    
    //output of the function onto the screen
    int output(char *text)
    {
      int calc = 0;
      while (text[calc] != '\0')
      {
        printf("%c",text[calc]);
        calc++;
      }
    return 0;
    }
    
    int main()
    {
    unsigned int counter = 0;
    char *text = NULL;
    
    insertion(text, &counter);
    output(text);
    
    return 0;
    }
    

    Freu mich schon auf eure Tips!
    MfG



  • Auf den ersten Blick:

    while (text[*counter] != EOF)
    

    Der Speichervereich ist frisch geholt. Woher soll in text[] ein EOF sein?

    text = buffer;
    free(buffer);
    

    Damit ist auch text nicht mehr gültig. Das free müsste in main() oder in einer neuen funktion aufraeumen(...) sein.



  • Hmm, prinzipiell will ich es dem Benutzer möglich machen so viele Buchstaben, Zahlen und Sonderzeichen einzugeben wie er will. Beenden will ich die Eingabe dann durch einen EOF der meines Wissens mit dem Tastenkürzel "Strg+d" erzeugt wird (das heisst der Benutzer muss "Strg+d" drücken damit die Eingabe beendet ist). Aus diesem Grund hab ich diese while - Konfiguration verwendet, da ich dadurch auch locker meinen Speicher vergrößern kann wenn es notwendig ist (durch realloc).

    while (text[*counter] != EOF)
    

    Okay das mit dem free für den buffer war schon ein Fehler.. das pack ich in die main(), aber ich hab mir gedacht dass ich zuerst für einen Buffer einen größeren Adressbereich zur Verfügung stelle und wenn dieser gultig ist, dann übergebe ich diese neue Standortadresse an meine Input-Variable text.

    Von der Funktion her doch eigentlich korrekt oder?
    greets



  • char *text = NULL;
    
    insertion(text, &counter);
    output(text);
    

    Zunächst mal wird text bei output immer NULL sein, egal was du in deiner Funktion insertion machst. Du hast die Parameterübergabe bei C Funktionen nicht verstanden.
    Deine output-Funktion entspricht der C Standardfunktion printf("%s",...);



  • Ein Bekannter hat mir aus der Patsche geholfen und mir Tipps zu meinen Fehlern gegeben.

    Wichtigster Punkt war wohl:

    char* insertion(unsigned int *counter, int *error)  //pointer function creates text input
    .
    .
    .
    return text;
    

    und

    text = insertion(&counter, &error); //start the input and recieve the array
    

    Hab zwar jetzt schon ein paar Tuts durchgearbeitet aber diese Aufgabenstellung war noch bei keinem Übungsbeispiel dabei.

    Danke an dieser Stelle für eure schnelle Unterstützung!


Anmelden zum Antworten