C Segmentation Fault 11

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. :)
 

Robat

Top Contributor
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
 

Thallius

Top Contributor
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.
 

daybyter

Aktives Mitglied
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?
 
Danke für die Antworten :)

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

Du willst mit printf einen 0-terminierten String schreiben, richtig? buffer[BUFF_SIZE] bleibt immer auf 0, damit dort das printf definitiv abbricht.
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.
 
Durch was? Poste bitte deine Lösung für Leute mit dem selben Problem :)
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.
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;
}
 

Neue Themen


Oben