# C Segmentation Fault 11



## Death_Vader97 (9. Dez 2016)

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 (9. Dez 2016)

*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 (9. Dez 2016)

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 (11. Dez 2016)

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 (11. Dez 2016)

Danke für die Antworten 

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



daybyter hat gesagt.:


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


----------



## Robat (11. Dez 2016)

Death_Vader97 hat gesagt.:


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


Durch was? Poste bitte deine Lösung für Leute mit dem selben Problem


----------



## Death_Vader97 (11. Dez 2016)

Robat hat gesagt.:


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

```
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;
}
```


----------

