这段错误意味着什么?

时间:2016-05-23 04:59:57

标签: c struct segmentation-fault binaryfiles

当我运行我的C程序并且我不理解它时,我有一个分段错误。 我正在从包含学生结构的二进制文件中读取标题。

这是我用gdb运行时遇到的seg错误

编程接收信号SIGSEGV,分段故障。 主要()的0x0804850f在aidb.c:49 49}

我认为分段错误位于第49行,但是第49行只有我的main()方法的右括号。 这是我的代码,以防它有助于澄清事情:

#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 个答案:

答案 0 :(得分: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);

这本身不会导致分段错误。这是可能有错误的代码的症状。请务必将id_chars的定义更改为

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

或更改要使用的fread行:

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