Speicherzugriffsfehler



  • Hi, ich brauch mal hilfe,

    hab ein Programm zur Flugbahnberechnung schreiben müssen (für Uni) und hab in der folgenden Quelltextdatei das Problem, dass der Speicherzugriff fehlerhaft ist.

    lesen.c

    #include <stdio.h>
    
    void lesen(char pname[7][31], double *wert)
    {
    /* Variablendefinition */
    
    int i;
    FILE *datin;
    
    /* Oeffnen der Datei 'para.dat' */
    
    datin = fopen("para.dat", "r");
    printf("\n");
    /* Beginn Zaehlschleife */
    
    for (i = 0; i < 7; i++)
    {
    /* Einlesen des Parameternamen und des Werts */
    
    fscanf(datin, "%30s %lf", pname[i], &wert[i]);
    
    /* Ausgabe des Parameternamens und des Werts */
    
    printf("%-30s %20.5lf\n", pname[i], wert[i]);
    }
    
    /* Ende Zaehlschleife */
    
    /* Schliessen der Datei 'para.dat' */
    
    fclose (datin);
    return;
    }
    

    Und folgendes spuckt Valgrind aus:

    f_kissig@F1:~/Dino> valgrind Flugbahnberechner
    ==11816== Memcheck, a memory error detector.
    ==11816== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
    ==11816== Using LibVEX rev 1313, a library for dynamic binary translation.
    ==11816== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.
    ==11816== Using valgrind-3.0.1.SVN, a dynamic binary instrumentation framework.
    ==11816== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
    ==11816== For more details, rerun with: -v
    ==11816==
    Willkommen beim Programm zur Flugbahnberechnung.

    1. Startparameter lesen
    2. Startparameter ändern
    3. Startparameter speichern
    4. Flugbahn berechnen
    5. Bahngröße maximieren
    6. Graphische Ausgabe
    7. Programm verlassen

    1

    ==11816== Invalid read of size 1
    ==11816== at 0x1B99222C: _IO_vfscanf (in /lib/tls/libc-2.3.5.so)
    ==11816== by 0x1B997DF0: vfscanf (in /lib/tls/libc-2.3.5.so)
    ==11816== by 0x1B99C961: fscanf (in /lib/tls/libc-2.3.5.so)
    ==11816== by 0x804885B: lesen (in /home/f_kissig/Dino/Flugbahnberechner)
    ==11816== by 0x8048705: main (in /home/f_kissig/Dino/Flugbahnberechner)
    ==11816== Address 0x46 is not stack'd, malloc'd or (recently) free'd
    ==11816==
    ==11816== Process terminating with default action of signal 11 (SIGSEGV)
    ==11816== Access not within mapped region at address 0x46
    ==11816== at 0x1B99222C: _IO_vfscanf (in /lib/tls/libc-2.3.5.so)
    ==11816== by 0x1B997DF0: vfscanf (in /lib/tls/libc-2.3.5.so)
    ==11816== by 0x1B99C961: fscanf (in /lib/tls/libc-2.3.5.so)
    ==11816== by 0x804885B: lesen (in /home/f_kissig/Dino/Flugbahnberechner)
    ==11816== by 0x8048705: main (in /home/f_kissig/Dino/Flugbahnberechner)
    ==11816==
    ==11816== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 20 from 4)
    ==11816== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==11816== malloc/free: 1 allocs, 1 frees, 352 bytes allocated.
    ==11816== For counts of detected errors, rerun with: -v
    ==11816== No malloc'd blocks -- no leaks are possible.
    Speicherzugriffsfehler
    f_kissig@F1:~/Dino>

    Vielen Dank, für eure Bemühungen.



  • zeig den funktionsaufruf.



  • Hat sich schon erledigt, ich hate vergessen, einer benöigte Datei, aus der er lesen soll, mit hinein zu kopieren.



  • Darum überprüft man bei fopen auch, ob der Rückgabewert NULL ist.


Anmelden zum Antworten