C Segmentation Fault 11

Dieses Thema C Segmentation Fault 11 im Forum "C/C++" wurde erstellt von Death_Vader97, 9. Dez. 2016.

Thema: C Segmentation Fault 11 Hallo, ich fange gerade im Studium mit C an, habe davor nur Java programmiert. Jetzt sollte ich in einer Aufgabe...

  1. Hallo,
    ich fange gerade im Studium mit C an, habe davor nur Java programmiert. Jetzt sollte ich in einer Aufgabe eine Datei schrittweise kopieren. Dazu habe ich eine Methode geschrieben. Das automatische Kontrollprogramm meiner Hochschule gibt aber dazu folgenden Fehler aus:
    Fehler: Prozess beendet durch Signal (11) Segmentation fault
    Mehr Informationen habe ich darüber nicht und ich kann nicht erkennen, wo der Fehler liegt.
    Hier ist die Methode: http://pastebin.com/6qNEsykJ

    Danke im Voraus. :)
     
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. Segmentation fault bedeutet, dass du irgendwo den zugewiesenen Speicher überschreitest.
    Da du mit Arrays arbeitest wird es wahrscheinlich so sein, dass du die Grenzen eines Arrays überschreitest.
    Wie ist denn deine BUFFER_SIZE deklariert / definiert?
    Das hier: char buffer[BUFFER_SIZE+1]; sieht mir komisch aus.

    PS: Nächstes mal deinen Code bitte in [code=Java]...[/code] Tags.
    So kann man dich besser zitieren.

    Gruß
    Robert
     
    VfL_Freak und Death_Vader97 gefällt das.
  4. Also ich kann da auf Anhieb keinen Fehler erkennen. Es sei denn die Definition von buffersize fehlt aber dann sollte eigentlich ein undefined value oder sowas kommen.
     
  5. Du willst mit printf einen 0-terminierten String schreiben, richtig? buffer[BUFF_SIZE] bleibt immer auf 0, damit dort das printf definitiv abbricht. Aber: was passiert, wenn Du ein Binärfile kopierst, welches einen Block Nullen enthält? Dann bricht doch Dein printf schon vorher ab? Wäre es nicht geschickter den Rückgabewert von fread zu nehmen und diese Anzahl Bytes mit fwrite wieder rauszuschreiben?
     
    Death_Vader97 und Thallius gefällt das.
  6. Danke für die Antworten :)

    Ich konnte das Problem lösen, indem ich fprintf() mit fwrite() ersetzt habe.

    Ich habe das Array ja nicht initialisiert, demnach könnte dort alles mögliche drin stehen, oder? Deswegen wollte ich sicher gehen, dass am Ende eine terminierende 0 steht.
     
  7. Durch was? Poste bitte deine Lösung für Leute mit dem selben Problem :)
     
  8. Okay, hier ist meine Lösung :)

    Wahrscheinlich kann man sich das Leeren des Buffers am Anfang jetzt auch sparen (und den zusätzlichen Platz für die terminierende 0), aber so funktioniert es auf jeden Fall.
    Code (C):
    int copy_file(char *source,char* dest)
    {

        char buffer[BUFFER_SIZE+1];
        int i;
        for (i = 0 ; i < BUFFER_SIZE ; i++) //clear buffer
            buffer[i] = 0;

        //open source file
        FILE *fSource = fopen(source,"r");
        if (fSource == NULL){
            return 1;
        }

        //open destination file
        FILE *fDest = fopen(dest,"w");
        if (fDest == NULL){
            fclose(fSource);
            return 2;
        }

        //copy data
        while (!feof(fSource) && !ferror(fSource) && !ferror(fDest)){

            int readAmount = fread(buffer,1,BUFFER_SIZE,fSource); //lpad chunk into buffer
            if (ferror(fSource)){
                fclose(fSource);
                fclose(fDest);
                return 3;
            }

            fwrite(buffer,1,readAmount,fDest); //save chunk from buffer into destination
            if (ferror(fDest)){
                fclose(fSource);
                fclose(fDest);
                return 4;
            }
        }

        //end
        fclose(fSource);
        fclose(fDest);
        return 0;
    }
     
  9. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!