fopen und malloc gleichzeitig verursacht Speicherzugriffsfehler



  • Hallo Leute,

    gleich mal zum Anfang: Ich bin Programmieranfänger (zumindest mit C).
    Liegt wahrscheinlich also daran.

    Ich habe folgende C-Datei geschrieben.
    Dabei funktionieren die Teile für fopen und malloc getrennt schon, nur nicht miteinander.
    Bitte um Hilfe, komm nämlich nicht drauf, warum.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    FILE *datei;
    
    int main(void) {
    
    // FOPEN
    
    char *speicher;
    int groesse;
    int anzahl;
    
    datei = fopen("/home/thomas/c/stat/textdatei.txt","r");
    groesse = 50;
    
    while(fgets(speicher, groesse, datei)) {
      fputs(speicher,stdout);
      anzahl = strlen(speicher);
      speicher[anzahl-1]='\0'; }
    
    fclose(datei);
    
    // MALLOC
    
    int *p;
    
    p = malloc(sizeof(int));
       if(p != NULL) {
         *p=99;
       }
       else {
         return EXIT_FAILURE;
       }
    
    return 0;
    }
    

    Ach ja, hier ein paar Daten:
    Betriebssystem: Linux
    Compiler: gcc



  • Du hast zwar einen Zeiger 'char* speicher;' definiert, aber der zeigt irgendwohin - bevor du damit etwas sinnvolles machst, mußt du ihn auf verwendbaren Speicher zeigen lassen.

    (btw, ist das dort die funktionierende Variante oder die defekte? ich würde auf letzteres tippen)



  • danke für die schnelle Antwort,
    hat aber leider nichts geholfen.

    Hab jetzt

    char *speicher = "";
    

    draus gemacht.

    Das komische ist ja, dass die beiden Programmteile beide funktionieren.
    Nur leider nicht miteinander.
    Einzeln schon



  • Ein String-Literal ist ja auch nicht das richtige Ziel, um Daten reinzuschreiben 😉 Nimm entweder ein (ausreichend großes) char-Array oder hol dir den Speicher mit malloc().



  • Vielen Dank.

    Das hat geklappt.
    Hab jetzt

    char speicher[50];
    

    draus gemacht.

    Wie schon gesagt, bin ein Newby.
    Warum hat das jetzt geklappt?
    Aber eigentlich bin ich erst mal froh, dass es geklappt hat.
    Jetzt würd mir nur helfen zu wissen, warum.
    Damit ich den Fehler nicht öfters mach.

    Danke



  • Vielen Dank.

    Das hat geklappt.
    Hab jetzt

    char speicher[50];
    

    draus gemacht.

    Wie schon gesagt, bin ein Newby.
    Warum hat das jetzt geklappt?
    Aber eigentlich bin ich erst mal froh, dass es geklappt hat.
    Jetzt würd mir nur helfen zu wissen, warum.
    Damit ich den Fehler nicht öfters mach.

    Danke



  • char *zeiger; zeigt einfach irgend wo in den Speicher. Wenn du da nun versuchst reinzuschreiben, schreibst du entweder in Speicher, der dir nicht gehört (=> Segmentation Fault) oder du überscheibst Daten, die du nicht überschreiben solltest.



  • Wenn du fgets() einen Zeiger übergibst, erwartet er, daß er dort genug Platz hat, um etwas reinzuschreiben - wenn nicht, gibt es eine Katastrophe (fgets() kann nicht selber feststellen, ob das Ziel gültig ist, deshalb verlässt es sich auf dich).

    Im ersten Beispiel hast du einen nicht-initialisierten Zeiger übergeben (der zeigt irgendwo in den RAM, wahrscheinlich in Bereiche, die woanders gebraucht werden - möglicherweise hast du ja Daten des Heap-Managers erwischt).
    Im zweiten Fall auf das String-Literal "" (das ist eine ordentlich definierte Adresse, hat aber erstens nur Platz für 1 Byte (der Null-Terminator des leeren Strings) und ist zweitens typischerweise schreibgeschützt).

    (beim funktionierenden Fall wurde der Name des Arrays als Zeiger auf den Arrayanfang verwendet - und dort war tatsächlich genug Platz für deine Eingabe)



  • Danke für die Hilfe
    Ich glaub so langsam dämmerts mir 💡


Anmelden zum Antworten