Forum: Compiler & IDEs Seltsames Verhalten, Speicherzugriffsfehler/Buszugriffsfehler


von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich komme gerade nicht weiter, das Programm hat heute Nachmittag noch 
funktioniert, was genau ich verändert habe, kann ich leider nicht mehr 
nachvollziehen.

Das Programm soll einen Parser für 16bit Intel-Hexfiles darstellen.

Im Anhang der komplette Code, hier der betreffende Teil vom Code:
1
FILE *hexfile;
2
struct stat buf;
3
unsigned char c;
4
stat(argv[1], &buf);
5
int fsize = buf.st_size;
6
...
7
hexfile = fopen(argv[1], "rb");
8
printf("file '%s' opened\n", argv[1]);
9
printf("test1\n");
10
while(fsize > 0) {
11
         printf("test2");
12
         c = fgetc(hexfile);
13
         ...

Die Ausgabe "test2" wird nicht mehr angezeigt, "test1" schon, es kommt 
beim Aufrufen immer abwechselnd Speicherzugriffsfehler und 
Buszugriffsfehler.

Die Übergabe vom Hexfile-Dateinamen und stat funktioniert, hier mal die 
beiden verschiedenen Ausgaben:
1
filesize 188 bytes
2
file 'hexfile.hex' opened
3
test1
4
Bus-Zugriffsfehler
5
6
filesize 188 bytes
7
file 'hexfile.hex' opened
8
test1
9
Speicherzugriffsfehler


Ich hoffe, ihr könnt mir da weiterhelfen...

von Stefan E. (sternst)


Lesenswert?

1
  int i;
2
...
3
    line_buffer[i] = c;
i ist nicht initialisiert.

von Jim M. (turboj)


Lesenswert?

Wie Stefan korrekt schreibt, ist `i` nicht initialisiert.

Die Ausgabe von
1
printf("test2");
fehlt, weil diese Ausgabe normalerweise in einem Puffer landet. Hängt 
man ein "\n" ran, wird dieser Puffer ausgegeben, alternativ geht auch:
1
fflush(NULL);

Beim Debuggig mit printf verwirrt dies immer etwas, wenn Zugriffsfehler 
auftreten - der Puffer wird dann verworfen und nicht ausgegeben.

von Rolf Magnus (Gast)


Lesenswert?

Jim Meba schrieb:
> Die Ausgabe vonprintf("test2");fehlt, weil diese Ausgabe normalerweise in einem
> Puffer landet. Hängt man ein "\n" ran, wird dieser Puffer ausgegeben, alternativ
> geht auch:fflush(NULL);

Es würde auch ein
1
fflush(stdout);
 reichen.

> Beim Debuggig mit printf verwirrt dies immer etwas, wenn Zugriffsfehler
> auftreten - der Puffer wird dann verworfen und nicht ausgegeben.

Deshalb gibt's ja eigentlich auch stderr, das genau aus diesem Grund 
nicht gepuffert ist.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Ah, vielen Dank! Was mich wundert, dass er nicht meckert, obwohl ich mit 
-Wall und -Wextra compiliere.

Selbst wenn ich -Wuninitialized extra angebe, meckert er nicht...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.