Speicherzugriffsfehler bei Versuch, in Datei zu schreiben



  • Hi(gh)!

    Zwischenzeitlich versuche ich mich an einem Programm, dass aus langjährigen Temperatur- und Niederschlagsdaten Klimaformeln nach Köppen/Geiger berechnet... die eigentliche Berechnung funktioniert auch einwandfrei, beim Schreiben der über stdin eingegebenen Daten in eine Datei hakt es leider wieder aus: Speicherzugriffsfehler!
    Warum?

    Hier ist der Code der fraglichen Funktion:

    int write(float* temp, float* prec, char* stat, char lat_deg, char* formula)
    {
      FILE* fp;
      if (!open(strcat(stat,".cdat"), "w"))
      {  
        printf("\nDatei kann nicht geschrieben werden!");
        return 1;
      }
      fprintf(fp, "%s", stat); // Stationsname
      /* if (fclose(fp) == EOF)
      {  
        printf("\nDatei kann nicht geschlossen werden!");
        return 1;
      }*/
    }    
    

    Bis bald im Khyberspace!

    Yadgar



  • Hm, sind deine Strings nullterminiert?



  • @spiri sagte in Speicherzugriffsfehler bei Versuch, in Datei zu schreiben:

    Hm, sind deine Strings nullterminiert?

    stat kommt auf diese Weise zustande:

    printf("\nName der Wetterstation: ");
           station = (char*)malloc(statsize * sizeof(char));
           if (station == NULL)
           {
             perror("Speicher kann nicht zugewiesen werden");
             exit(1);
           }
           getline(&station,&statsize,stdin);
    

    und ".cdat" ist ein Stringliteral, müsste also terminiert sein!

    Bis bald im Khyberspace!

    Yadgar



  • Ich glaube das liegt dann an getline(), du musst das Ding selbst noch terminieren.

    sizeof(char) ist immer 1.



  • Hi(gh)!

    @spiri sagte in Speicherzugriffsfehler bei Versuch, in Datei zu schreiben:

    Ich glaube das liegt dann an getline(), du musst das Ding selbst noch terminieren.

    sizeof(char) ist immer 1.

    Wie mache ich das denn, wenn der tatsächlich eingegebene String kürzer ist als statsize*sizeof(char)-1?

    Bis bald im Khyberspace!

    Yadgar



    • fp ist nicht initialisiert, weil nirgendwo ein fopen aufegerufen wird.
    • du hängst etwas an stat an, bietet stat ausreichend Platz dafür?


  • @yadgar sagte in Speicherzugriffsfehler bei Versuch, in Datei zu schreiben:

    Wie mache ich das denn, wenn der tatsächlich eingegebene String kürzer ist als statsize*sizeof(char)-1?

    Ich glaube, es zwischenzeitlich selbst herausgefunden zu haben:

            printf("\nName der Wetterstation: ");
            station = (char*)malloc(statsize * sizeof(char));
            if (station == NULL)
            {
              perror("Speicher kann nicht zugewiesen werden");
              exit(1);
            }
            f = getline(&station,&statsize,stdin);
            station[f-1]='\0';
    

    ...das hat aber nichts gebracht, ich bekomme immer noch den Speicherzugriffsfehler angezeigt!

    Bis bald im Khyberspace!

    Yadgar



  • @docshoe sagte in Speicherzugriffsfehler bei Versuch, in Datei zu schreiben:

    • fp ist nicht initialisiert, weil nirgendwo ein fopen aufegerufen wird.
    • du hängst etwas an stat an, bietet stat ausreichend Platz dafür?

    Mittlerweile wird fp initialisiert:

    int write(float* temp, float* prec, char* stat, char lat_deg, char* formula)
    {
      FILE* fp;
      if (!fopen(strcat(stat,".cdat"), "w"))
      {  
        printf("\nDatei kann nicht geschrieben werden!");
        return 1;
      }
      fprintf(fp, "%s", stat); // Stationsname
      /* if (fclose(fp) == EOF)
      {  
        printf("\nDatei kann nicht geschlossen werden!");
        return 1;
      }*/
    }
    

    ...und stat ist mit 30 Zeichen (einschließlich Ende-Null) auch groß genug! Aber ich habe IMMER noch den Speicherzugriffsfehler...

    Liegt es daran, dass nach dem Anhängen von ".cdat" keine Stringende-Null mehr vorhanden ist? Oder liefern Stringliterale automatisch die Ende-Null mit?



  • Mittlerweile wird fp initialisiert:

    Wo?



  • @manni66 sagte in Speicherzugriffsfehler bei Versuch, in Datei zu schreiben:

    Mittlerweile wird fp initialisiert:

    Wo?

    O.k., jetzt hier:

    FILE* fp;
      fp = fopen(strcat(stat,".cdat"), "w");
    

    ...und jetzt gibt es auch keinen Speicherzugriffsfehler mehr! Danke für den Hinweis!



  • Wenn du bei getline einen String einliest, der annäherend (oder sogar größer als) statsize ist, dann führt das strcat(stat,".cdat") zu UB (da dann kein Speicherplatz mehr dafür reserviert wurde), so wie @DocShoe schon angemerkt hatte.



  • Hi(gh)!

    @th69 sagte in Speicherzugriffsfehler bei Versuch, in Datei zu schreiben:

    Wenn du bei getline einen String einliest, der annäherend (oder sogar größer als) statsize ist, dann führt das strcat(stat,".cdat") zu UB (da dann kein Speicherplatz mehr dafür reserviert wurde), so wie @DocShoe schon angemerkt hatte.

    Wie ich schon schrieb, hatte ich dieses Problem nicht, da Stationsname plus ".cdat" deutlich kürzer als die 30 reservierten Bytes waren... dafür sind jetzt gleich drei neue Probleme aufgetaucht - dazu aber dann eigene Threads!

    Bis bald im Khyberspace!

    Yadgar


Log in to reply