2016-05-23 4 views
0

У меня ошибка сегментации, когда я запускаю свою программу на C, и я ее не понимаю. Я читаю заголовок из двоичного файла, который содержит студенческие структуры.Что означает эта ошибка сегмента?

это вина сегментный я получаю, когда я запустить его с помощью GDB

Программа получила сигнал SIGSEGV, неисправность Сегментация. 0x0804850f в основной() в aidb.c: 49 49}

Я нахожусь под впечатлением, что ошибка сегментации находится на линии 49, однако есть только закрывающая скобка моего основного метода() в строке 49. Это мой код, только в случае, если это помогает прояснить вещи:

#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];' -> 'символьные id_chars [4];', 'fread (table, sizeof (SectionHeader), 48, infile);': '48' ->' 4' – BLUEPIXY

+0

Проверьте, является ли ваша infile NULL. – ebby94

+0

Сбои на закрывающей скобке функции (и вообще в операторах 'return') обычно связаны с переписанием адреса функции return, что часто вызвано выходом из границ локальных массивов. –

ответ

3

вы объявляете table как:

SectionHeader table[4]; 

Затем вы пытаетесь прочитать в table 48 объектов по размеру sizeof(SectionHeader).

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

Существует не хватает места в table считать, что много данных. Из-за этого вы пишете память, которую вы не должны. Это является причиной неопределенного поведения. В вашем случае неопределенное поведение проявляется как ошибка сегментации, когда программа возвращается с main.

Вы можете исправить эту проблему, изменив размер table или изменив линию fread. Убедитесь, что у table достаточно места для чтения данных.

Другая ошибка в коде является то, что id_chars член Header определяется как:

int id_chars[4]; 

При считывании данных в нее, вы используете

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

Это само по себе выиграл» t вызывает ошибку сегментации. Это признак возможного кода с ошибкой. Убедитесь в том, чтобы изменить определение id_chars к

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

или изменить fread линию использовать:

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

Я изменил int id_chars [4] на char id_chars [4], но я все еще получаю ошибку seg. Предполагается, что есть только около 4 заголовков, поэтому я имею таблицу SectionHeader [4]; Будет ли он более крупным, заставлять его читать данные, которые не предполагается? Данные, которые мне нужны, должны поступать сразу после четырех объектов SectionHeader – Shango

+0

благодаря большому количеству ответов @BLUEPIXY. Спасибо, парни. – Shango

Смежные вопросы