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