2016-05-23 21 views
0

Ich habe eine Segmentierung Fehler, wenn ich mein C-Programm ausführen, und ich verstehe es nicht. Ich lese den Header aus einer Binärdatei, die Student-Strukturen enthält.Was bedeutet dieser seg Fehler bedeutet

dies ist der seg Fehler, den ich bekommen, wenn ich es mit gdb laufen

Programmsignal SIGSEGV empfangen, Fehlersegmentierung. 0x0804850f in main() bei aidb.c: 49 49}

ich unter dem Eindruck bin, dass die Segmentierungsfehler in Zeile 49, sind jedoch nur die Schließbügel meiner Methode main() in Zeile 49. Das ist mein Code, nur für den Fall hilft es, Dinge zu klären:

#include<stdio.h> 

typedef struct { 
    char id_chars[4]; 
    int file_size; 
    int section_table_offset; 
    int section_count; 
} Header; 


typedef struct { 
    int offset; 
    int num_entries; 
    int type; // legal value above 
} SectionHeader; 


    int main(void) { 


     FILE *infile = fopen("file.bin", "r"); 

     Header aidbheader; 


     //Reads the aidb file header 
     // fread(aidbheader, sizeof(Header),16, infile); 
     fread(&aidbheader.id_chars, sizeof(char),4, infile); 
     fread(&aidbheader.file_size, sizeof(int),1, infile); 
     fread(&aidbheader.section_table_offset, sizeof(int),1, infile); 
     fread(&aidbheader.section_count, sizeof(int),1, infile); 

     SectionHeader table[4]; 
     fread(table, sizeof(SectionHeader), 48, infile); 


     printf("\nSectionHeader offset: %d \n", table[3].offset); 




     return 0; 
    } // this is line 49 
+1

'int id_chars [4];' -> 'char id_chars [4];', 'fread (Tabelle, sizeof (SectionHeader), 48, Infile);': '48' ->' 4' – BLUEPIXY

+0

Überprüfen Sie, ob Ihre Eingabe NULL ist. – ebby94

+0

Abstürze auf die schließende Klammer einer Funktion (und im Allgemeinen auf 'return'-Anweisungen) sind normalerweise auf das Überschreiben der Funktionsrückgabeadresse zurückzuführen, was oft dadurch verursacht wird, dass die Grenzen lokaler Arrays überschritten werden. –

Antwort

3

Sie erklären table als:

SectionHeader table[4]; 

Dann versuchen Sie in table 48 Objekte mit einer Größe zu lesen sizeof(SectionHeader).

fread(table, sizeof(SectionHeader), 48, infile); 

Es gibt nicht genug Platz in table, dass viele Daten zu halten. Aus diesem Grund schreibst du über Speicher, die du nicht solltest. Das ist Ursache für undefiniertes Verhalten. In Ihrem Fall wird das undefinierte Verhalten als Segmentierungsfehler angezeigt, wenn das Programm von main zurückkehrt.

Sie können dieses Problem beheben, indem Sie die Größe table ändern oder die fread Zeile ändern. Stellen Sie sicher, dass table genug Platz zum Lesen der Daten hat.

Der andere Fehler im Code ist, dass das id_chars Mitglied Header definiert ist als:

int id_chars[4]; 

Wenn Sie Daten in sie lesen, werden Sie

fread(&aidbheader.id_chars, sizeof(char), 4, infile); 

das allein mit won‘ Ursache für Segmentierungsfehler. Es ist ein Symptom für möglicherweise fehlerhaften Code. Achten Sie darauf, die Definition von id_chars zu

char id_chars[4]; 
^^^ char not int 

zu ändern oder ändern Sie die fread Leitung zu verwenden:

fread(&aidbheader.id_chars, sizeof(int), 4, infile); 
            ^^^^ int not char 
+0

ich habe int id_chars [4] in char id_chars [4] geändert, aber ich bekomme immer noch einen seg Fehler. Es gibt nur ungefähr 4 Header, was der Grund ist, warum ich die SectionHeader-Tabelle [4] habe; Wird es eine größere Größe geben, damit es Daten lesen kann, die es nicht soll? Die Daten, die ich brauche, sollten direkt nach den 4 SectionHeader-Objekten kommen – Shango

+0

danke @BLUEPIXY Ihre Antwort war die Lösung für mein Problem. Danke Leute. – Shango